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


8

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

我想在压缩时使用最多1GB的RAM。我倾向于使用非对称算法,因为我拥有的文件相当大,并且它们需要至少一个小时才能在带有1GB RAM的P4机器上使用7-zip压缩LZMA1“ultra”而没有其他任何运行。我认为7-zip和FreeARC可以用于我的目的。我试图找到我应该使用的命令,但我没有太多运气。

编辑:即使创建日期不同,也应生成100%相同的文件。这应该可以通过 - 在Freearc中使用 - 并且使用???? 7拉链。我正在寻找一个7-zip的等效命令,以及一种在多台计算机上标准化压缩的方法。


1
你对LZMA的确定性有多确定?
Ignacio Vazquez-Abrams 2010年

2
展开没有太多运气的部分。
fideli 2010年

2
问题出在哪里?任何压缩程序都应该是无损的,除非它特别有损。
丹尼斯威廉姆森2010年

Answers:


11

创建几个相同的文件:

$ 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                         

有关时间戳的更多信息,请参阅RFC

现在,您可以采用在字节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

1
而且,如果没有其他gzip可用于Windows的端口,则Cygwin会提供它。
Arjan 2010年

3

不是你的问题的直接答案,但无论如何它可能会有所帮助。

很久以前(不同的千禧年)我遇到了同样的问题。我们想知道压缩文件是否相同而不解压缩它们并进行比较。

我们的解决方案是在压缩之前获取文件的md5sum,然后我们压缩文件并将其重命名为md5sum.zip (.zip或.tar.gz或.rar或.whatever)。这样我们就知道如果两个文件具有相同的名称(没有后缀),那么它们就是相同的。


2
很好,虽然当然我们知道应该读我们假设 ;-)
Arjan 2010年

也很好,因为它完全独立于压缩率:由不同程序或使用不同设置创建的压缩文件仍然可以被识别为相同。
Arjan 2010年

1
本文几乎试图解决同样的问题... medium.com/@mpreziuso
XCore

2

pristine-tar有一个haz-up版本的gzip,它总能产生相同的结果(另一个用于bzip2)。选择算法变量和时间戳,你就可以了。


1

入侵7-zip的来源。在读取文件日期的地方,只需插入代码即可将日期更改为01.01.1997,或其他任何内容 - 为所有文件修复。使用不同的名称编译并使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.