gzipしたときに同じコンテンツで異なるmd5sumを持つファイル?


16

なぜこれが起こっているのかわかりませんが、いくつかのファイルをアップロードしてAmazon S3、送信されたファイルを削除し、md5sumAmazonとローカルの両方でチェックします。しかし最近、同じコンテンツに関するこの問題が2つの異なるものを生成していることがわかりました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

誰がそれが起こっているのか知っていますか?または、ファイルの一貫性と信頼性を確認するにはどうすればよいですか?

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

それは同じ問題Tiagoを与えます。

回答:


54

RFC 1952によると、gzipファイルヘッダーには元のファイルの変更時刻が含まれます(フィールド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ヘッダーにはタイムスタンプが含まれます。圧縮ファイルを同じにするには、ファイルのタイムスタンプが同じである必要があります!

だから、あなたがファイルをコピーするとき、いつものようにそれを行うcp -p file1 file1だけでなく、cp file1 file2-実際に悪い癖になります!


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

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


Tiagoの回答を更新します。一般に問題は同じです。
ヴァルターシルバ

2
「-n」フラグと使用
ティアゴ・クルス

2
-1、この回答はコメント(または3)である必要があります
ブラジル人の

@ ruda.almeidaこれはテストする方法を示し、問題を修正しようとするため、十分に有効な回答です。
ジェームズメルツ

2
OK、「gzipを '-n'で使用する」前は、質問を明確にするためにコメントを作成する必要があります。そして、2番目の部分は技術的には正しいですが、問題の原因や提案された提案がそれを解決する理由を説明していないため、質の低い回答です。
そのブラジル人
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.