web-dev-qa-db-ja.com

同じ内容であるが、gzipで圧縮されたときにmd5sumが異なるファイル?

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

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

更新ティアゴクルーズの回答に答える:

[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

それはティアゴに同じ問題を与えます。

16
Valter Silva

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
54
mpy

同じファイルの圧縮バージョンが同じであると期待するのはなぜですか?圧縮プログラム(gzip)は、ヘッダーにタイムスタンプを含めることも、ランダム化されたアルゴリズムを使用することもできます。

そしてまさに! gzipヘッダー タイムスタンプを含む 。圧縮ファイルを同じにしたい場合は、ファイルのタイムスタンプを同じにする必要があります。

したがって、ファイルをコピーするときは、cp -p file1 file1だけでなく、常にcp file1 file2として実行してください。これは実際には悪い習慣です。

12
Tomas

'-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

10
Tiago Cruz