File dengan konten yang sama tetapi dengan md5sums yang berbeda saat gzip?

16

Saya tidak tahu mengapa ini terjadi, tetapi saya mengunggah beberapa file untuk Amazon S3kemudian menghapus file yang dikirim memeriksa md5sumkeduanya di Amazon dan lokal. Namun baru-baru ini saya menemukan masalah ini tentang konten yang sama menghasilkan dua yang berbedamd5sum

[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

Apakah ada yang tahu mengapa itu terjadi? Atau bagaimana saya harus memeriksa apakah file saya konsisten, dapat diandalkan?

memperbarui Menjawab Tiago Cruz jawaban:

[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

Ini memberi masalah yang sama Tiago.

Valter Silva
sumber

Jawaban:

54

Menurut RFC 1952 , gzipheader file menyertakan waktu modifikasi dari file asli (bidang MTIME). Anda dapat menampilkan header dalam teks biasa 1) dengan 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

Jadi, jika Anda benar-benar ingin membandingkan file gzip, kompreslah dengan -nopsi, untuk tidak menyimpan nama file asli dan cap waktu ,

gzip -n renew.log s3/renew.log 

dan md5sum mereka harus identik.

Kalau tidak, Anda bisa menggunakan

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

untuk menghitung md5sum dari file yang didekompresi.


1) Namun, waktu dan tanggal yang ditampilkan tidak diambil dari header, tetapi mewakili nilai saat ini; ini juga berlaku untuk nama file:

$ 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
mpy
sumber
12

Mengapa Anda mengharapkan versi terkompresi dari file yang sama tetap sama? Program kompres (gzip) dapat menyertakan beberapa cap waktu di header, atau dapat menggunakan beberapa algoritma acak.

Dan tepatnya! Header gzip berisi stempel waktu . Jika Anda ingin file yang dikompresi sama, file Anda harus memiliki stempel waktu yang sama!

Jadi, ketika Anda menyalin file, selalu lakukan cp -p file1 file1, bukan hanya cp file1 file2- itu sebenarnya kebiasaan buruk!

Tomas
sumber
10

Cukup gunakan gzip dengan flag '-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

Sumber: /unix/31008/why-does-the-gzip-version-of-files-produce-a-different-md5-checksum

Tiago Cruz
sumber
Saya memperbarui jawaban saya Tiago, secara umum masalahnya sama.
Valter Silva
2
Gunakan dengan bendera 'n'
Tiago Cruz
2
-1, jawaban ini harus berupa komentar (atau tiga)
Orang Brasil itu
@ ruda.almeida ini adalah jawaban yang cukup valid karena mencoba menunjukkan cara menguji, dan kemudian memperbaiki masalah.
James Mertz
2
OK, segala sesuatu sebelum "gunakan gzip dengan '-n'" harus dibuat komentar karena sedang mencoba untuk mengklarifikasi pertanyaan, tepatnya untuk apa komentar. Dan kemudian, bagian kedua secara teknis benar, tetapi itu adalah jawaban yang berkualitas rendah karena tidak menjelaskan apa yang menyebabkan masalah atau mengapa saran yang diajukan menyelesaikannya.
Orang Brazil itu