文件内容相同,但是经过 gzip 压缩后 md5sum 不同?

文件内容相同,但是经过 gzip 压缩后 md5sum 不同?

我不知道为什么会发生这种情况,但我上传了一些文件,然后Amazon S3删除了发送的文件,检查它们md5sum在亚马逊和本地。但最近我发现这个问题是关于相同内容生成两个不同的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

有人知道为什么会发生这种情况吗?或者我应该如何检查我的文件是否一致、可靠?

更新 回答蒂亚戈·克鲁兹的回答:

[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

这给 Tiago 带来了同样的问题。

答案1

根据RFC 1952gzip文件头包括修改时间原始文件(字段)的标题。您可以使用以下方式以纯文本1)MTIME显示标题: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

答案2

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

确实如此!gzip 标头包含时间戳。如果您希望您的压缩文件相同,您的文件必须具有相同的时间戳!

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

答案3

只需使用带有‘-n’标志的 gzip:

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

相关内容