Файлы с одинаковым содержимым, но с разными 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

Кто-нибудь знает, почему это происходит? Или как я должен проверить, являются ли мои файлы последовательными, надежными?

обновить Ответ 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

Это дает ту же проблему Тиаго.

Ответы:


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


Обновляю свой ответ Tiago, в общем проблема та же.
Вальтер Сильва

2
Используйте с флагом '-n'
Tiago Cruz

2
-1, этот ответ должен быть комментарий (или три)
Это бразильский парень

@ ruda.almeida - это правильный ответ, поскольку он пытается показать, как тестировать, а затем решить проблему.
Джеймс Мерц

2
Хорошо, все перед "использованием gzip с '-n'" должно быть прокомментировано, поскольку оно пытается прояснить вопрос, для чего именно нужны комментарии. И затем, вторая часть технически правильна, но это некачественный ответ, потому что он не объясняет, что вызывает проблему, и почему предлагаемое предложение решает ее.
Этот бразильский парень
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.