用gzip压缩时具有相同内容但具有不同md5sum的文件?


16

我不知道为什么会这样,但是我上载了一些文件,Amazon S3然后删除已发送的文件md5sum,并同时检查了它们在Amazon和本地的文件。但是最近我发现关于同一内容的这个问题正在产生两种不同的md5sum

[valter.silva@alog ~]$ ls
renew.log  s3

[valter.silva@alog ~]$ ls s3/
renew.log

[valter.silva@alog ~]$ md5sum renew.log 
d41d8cd98f00b204e9800998ecf8427e  renew.log

[valter.silva@alog ~]$ md5sum s3/renew.log 
d41d8cd98f00b204e9800998ecf8427e  s3/renew.log

[valter.silva@alog ~]$ gzip renew.log 
[valter.silva@alog ~]$ gzip s3/renew.log 

[valter.silva@alog ~]$ md5sum renew.log.gz 
aa1f0ae9a61aac5bcd32b917fbd9324b  renew.log.gz

[valter.silva@alog ~]$ md5sum s3/renew.log.gz 
6ae0e48edb68e9ed938fdfc3894f6c94  s3/renew.log.gz

有人知道为什么会这样吗?还是应该检查我的文件是否一致,可靠?

更新 Answering Tiago Cruz答案:

[valter.silva@alog ~]$ sha1sum renew.log 
da39a3ee5e6b4b0d3255bfef95601890afd80709  renew.log

[valter.silva@alog ~]$ sha1sum s3/renew.log 
da39a3ee5e6b4b0d3255bfef95601890afd80709  s3/renew.log

[valter.silva@alog ~]$ gzip renew.log 
[valter.silva@alog ~]$ gzip s3/renew.log 

[valter.silva@alog ~]$ sha1sum renew.log.gz 
2d9111d9db71da9fe4de57fbc19c89eb0bd46470  renew.log.gz

[valter.silva@alog ~]$ sha1sum s3/renew.log.gz 
05014ca24d133f1761f9134e8dab52e6e2111010  s3/renew.log.gz

这给了蒂亚戈同样的问题。

Answers:


54

根据RFC 1952gzip文件头包含原始文件的修改时间(字段MTIME)。您可以显示在纯文本标题1)具有gzip -lv renew.log.gz

method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 64263ac7 Jun 21 17:59                 314                 597  52.1% renew.log

因此,如果您真的想比较gzip文件,请使用-n选项将其压缩,以免保存原始文件名和时间戳

gzip -n renew.log s3/renew.log 

并且它们的md5sum应该相同。

否则你可以使用

md5sum <(zcat renew.log.gz) <(zcat s3/renew.log.gz)

计算解压缩文件的md5sum。


1)但是,显示的时间和日期并非来自标题,而是代表当前值;文件名也是如此:

$ gzip renew.log 
$ mv renew.log.gz foo.gz
$ gzip -lv foo.gz -------- uncompressed name is taken from current name ---v
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 6c721644 Jul 11 22:34                 580                1586  65.7% foo
$ hexdump -C foo.gz | head -n 2
00000000  1f 8b 08 08 f0 16 df 51  00 03 72 65 6e 65 77 2e  |.......Q..renew.|
00000010  6c 6f 67 00 8d 93 dd 6e  9b 30 18 86 8f 89 94 7b  |log....n.0.....{|
                                                             ^^^-------^^^^^
                                                  original filename is stored in the header

12

您为什么期望同一文件的压缩版本相同?压缩程序(gzip)可以在标头中包含一些时间戳,或者可以使用一些随机算法。

恰好!gzip标头包含timestamp。如果您希望压缩文件相同,则文件必须具有相同的时间戳!

因此,当您复制文件时,请始终按cp -p file1 file1而不是的方式进行操作cp file1 file2-这实际上是一个坏习惯!


10

只需将gzip与'-n'标志一起使用:

tiagocruz@stark:~$ gzip -n Yippie-Ki-Yay.mp3 bla/Yippie-Ki-Yay.mp3 

tiagocruz@stark:~$ sha1sum Yippie-Ki-Yay.mp3.gz bla/Yippie-Ki-Yay.mp3.gz 
b44b21c5f414935f1ced1187bfafd989704474a5  Yippie-Ki-Yay.mp3.gz
b44b21c5f414935f1ced1187bfafd989704474a5  bla/Yippie-Ki-Yay.mp3.gz

来源:https//unix.stackexchange.com/questions/31008/why-does-the-gzip-version-of-files-produce-a-different-md5-checksum


我更新我的答案Tiago,总的来说问题是一样的。
Valter Silva

2
与“ -n”标志一起使用
Tiago Cruz

2
-1,这个答案应该是评论(或三个)
巴西的Guy

@ ruda.almeida,这是一个足够有效的答案,因为它试图显示如何测试,然后解决问题。
James Mertz 2013年

2
好的,在“将gzip与'-n'一起使用”之前的所有内容都应添加注释,因为它试图澄清问题,确切地说是什么注释。然后,第二部分在技术上是正确的,但这是低质量的答案,因为它没有解释导致问题的原因,也没有解释提议的建议为何能够解决该问题。
那个巴西人
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.