gzip'd 时具有相同内容但具有不同 md5sum 的文件?

Val*_*lva 16 linux gzip md5

我不知道为什么会发生这种情况,但我上传了一些文件,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
Run Code Online (Sandbox Code Playgroud)

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

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

[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
Run Code Online (Sandbox Code Playgroud)

它给出了同样的问题 Tiago。

mpy*_*mpy 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
Run Code Online (Sandbox Code Playgroud)

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

gzip -n renew.log s3/renew.log 
Run Code Online (Sandbox Code Playgroud)

并且它们的 md5sum 应该相同。

否则你可以使用

md5sum <(zcat renew.log.gz) <(zcat s3/renew.log.gz)
Run Code Online (Sandbox Code Playgroud)

计算解压文件的 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
Run Code Online (Sandbox Code Playgroud)


Tom*_*mas 12

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

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

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


Tia*_*ruz 10

只需使用带有'-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
Run Code Online (Sandbox Code Playgroud)

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

  • 与“-n”标志一起使用 (2认同)
  • -1,这个答案应该是一个评论(或三个) (2认同)
  • 好的,在“将 gzip 与 '-n' 一起使用”之前的所有内容都应该进行评论,因为它试图澄清问题,确切地说是评论是为了什么。然后,第二部分在技术上是正确的,但它是一个低质量的答案,因为它没有解释是什么导致了问题,也没有解释为什么提出的建议可以解决它。 (2认同)