对于仅创建日期不同的源文件,如何获得 100% 相同的压缩文件?

对于仅创建日期不同的源文件,如何获得 100% 相同的压缩文件?

我希望能够无损压缩文件,并且如果原始文件与另一个用户的文件相同,我希望我们的压缩文件能够匹配,即使原始文件的日期不同

我希望在压缩时最多使用 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,或其他任何日期 - 已修复所有文件。使用不同的名称进行编译并使用它。

相关内容