Pliki o tej samej zawartości, ale z różnymi sumami md5, gdy są rozpakowane?

16

Nie wiem, dlaczego tak się dzieje, ale przesyłam niektóre pliki, aby Amazon S3następnie usunąć przesłane pliki, sprawdzając je md5sumzarówno w Amazon, jak i lokalnie. Ale ostatnio odkryłem, że ten problem dotyczący tej samej treści generuje dwa różnemd5sum

[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

Czy ktoś wie, dlaczego tak się dzieje? Lub jak mam sprawdzić, czy moje pliki są spójne, niezawodne?

aktualizacja Odpowiadanie Odpowiedź 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

Daje ten sam problem Tiago.

Valter Silva
źródło

Odpowiedzi:

54

Zgodnie z RFC 1952 The gzipnagłówek pliku zawiera czas modyfikacji oryginalnego pliku (pole MTIME). Możesz wyświetlić nagłówek w postaci zwykłego tekstu 1) za pomocą 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

Jeśli więc naprawdę chcesz porównać pliki gzip, skompresuj je z -nopcją, aby nie zapisywać oryginalnej nazwy pliku i znacznika czasu ,

gzip -n renew.log s3/renew.log 

a ich suma md5 powinna być identyczna.

W przeciwnym razie możesz użyć

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

obliczyć sumę md5 zdekompresowanych plików.


1) Jednak wyświetlana godzina i data nie są pobierane z nagłówka, ale reprezentują bieżące wartości; dzieje się tak również w przypadku nazwy pliku:

$ 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
źródło
12

Dlaczego oczekujesz, że skompresowana wersja tego samego pliku będzie taka sama? Program kompresujący (gzip) może zawierać znacznik czasu w nagłówku lub może wykorzystywać niektóre losowe algorytmy.

A dokładnie! Nagłówek gzip zawiera znacznik czasu . Jeśli chcesz, aby skompresowane pliki były takie same, plik musi mieć ten sam znacznik czasu!

Tak więc, kiedy kopiujesz plik, zawsze rób to cp -p file1 file1nie tylko cp file1 file2- to w rzeczywistości zły nawyk!

Tomas
źródło
10

Wystarczy użyć gzip z 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

Źródło: /unix/31008/why-does-the-gzip-version-of-files-produ-a-different-md5-checksum

Tiago Cruz
źródło
Aktualizuję swoją odpowiedź Tiago, ogólnie problem jest taki sam.
Valter Silva,
2
Użyj z flagą „-n”
Tiago Cruz,
2
-1, ta odpowiedź powinna być komentarzem (lub trzema)
Ten Brazylijczyk
@ ruda.almeida jest to wystarczająco poprawna odpowiedź, ponieważ próbuje pokazać, jak przetestować, a następnie naprawić problem.
James Mertz,
2
OK, wszystko przed „użyciem gzip z '-n'” powinno zostać skomentowane, ponieważ próbuje wyjaśnić pytanie, dokładnie do czego służą komentarze. A następnie druga część jest technicznie poprawna, ale jest to odpowiedź niskiej jakości, ponieważ nie wyjaśnia, co powoduje problem ani dlaczego proponowana sugestia go rozwiązuje.
Ten Brazylijczyk