我希望能够无损压缩文件,并且如果原始文件与另一个用户的文件相同,我希望我们的压缩文件能够匹配,即使原始文件的日期不同。
我希望在压缩时最多使用 1GB 的 RAM。我倾向于使用非对称算法,因为我的文件相当大,在一台 P4 机器上,在 1GB RAM 且没有其他程序运行的情况下,使用 7-zip 中的 LZMA1“ultra”压缩它们至少需要一个小时。我认为 7-zip 和 FreeARC 可以满足我的需求。我尝试找到我应该使用的命令,但运气不佳。
编辑:即使创建日期不同,也应该生成 100% 相同的文件。这应该可以通过 Freearc 中的 --nodates 和 7-zip 中的 ???? 来实现。我正在寻找 7-zip 的等效命令,以及一种在多台计算机上标准化压缩的方法。
答案1
创建几个相同的文件:
$ echo hello > file1.test
$ echo hello > file2.test
用 gzip 压缩它们...
$ gzip file1.test
$ gzip file2.test
观察时间戳字段作为唯一的区别:
$ hexdump file1.test.gz
0000000 8b1f 0808 TIME STMP 0300 6966 656c 2e31
0000010 6574 7473 cb00 cd48 c9c9 02e7 2000 3a30
0000020 0636 0000 0000
有关时间戳的更多信息,请参阅请求函数
现在,您可以采用从字节 8 之后开始的 MD5,将文件中的这四个字节清零并丢失其时间戳,或者从这些 gzip 中提取 CRC16(有关如何提取的信息,另请参阅 RFC)
或者,您可以保存而不使用时间戳:
$ echo test > file1.test
$ echo test > file2.test
$ gzip -n file1.test
$ gzip -n file2.test
$ md5sum file1.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82 file1.test.gz
$ md5sum file2.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82 file2.test.gz
答案2
虽然这不是对您的问题的直接回答,但无论如何它可能有帮助。
很久以前(另一个千年),我遇到了同样的问题。我们想知道压缩文件是否相同,而无需解压并进行比较。
我们的解决方案是md5sum在压缩文件之前,我们压缩了文件并将其重命名为md5sum.zip
(.zip 或 .tar.gz 或 .rar 或 .whatever)这样我们就知道,如果两个文件有相同的名称(没有后缀),它们就是相同的。
答案3
原始焦油有一个 gzip 的破解版本,它总是产生相同的结果(还有另一个用于 bzip2 的破解版本)。选择一个算法变体和一个时间戳,您就可以开始了。
答案4
侵入 7-zip 的源代码。在读取文件日期的地方,只需插入代码即可将日期更改为 01.01.1997,或其他任何日期 - 已修复所有文件。使用不同的名称进行编译并使用它。