Файли з однаковим вмістом, але з різними md5sums, коли gzip'd?


16

Я не знаю, чому це відбувається, але я завантажую деякі файли, щоб Amazon S3потім видалити надіслані файли, перевіряючи їх md5sumяк в Amazon, так і локально. Але нещодавно я виявив, що це питання про однаковий зміст генерує два різних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

Це дає ту ж проблему Тіаго.

Відповіді:


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'd, стисніть їх із -nможливістю, щоб не зберігати початкове ім'я файлу та штамп часу ,

gzip -n renew.log s3/renew.log 

і їх md5sum має бути ідентичним.

В іншому випадку ви можете використовувати

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

обчислити md5сум декомпресованих файлів.


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

Просто використовуйте gzip зі знаком '-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

Джерело: /unix/31008/why-does-the-gzip-version-of-files-produce-a-different-md5-checksum


Я оновлюю свою відповідь Тіаго, загалом проблема одна і та ж.
Вальтер Сільва

2
Використовуйте прапор '-n'
Tiago Cruz

2
-1, ця відповідь має бути коментарем (або трьома)
Той бразильський хлопець

@ ruda.almeida це досить вагома відповідь, оскільки вона намагається показати, як перевірити, а потім виправити проблему.
Джеймс Мерц

2
Добре, все до "використання gzip з '-n" слід зробити коментар, оскільки він намагається уточнити питання, що саме стосується коментарів. І тоді, друга частина технічно правильна, але це низька якість відповіді, оскільки вона не пояснює, що викликає проблему, і чому запропонована пропозиція її вирішує.
Той бразильський хлопець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.