File con lo stesso contenuto ma con md5sums diversi quando gzip'd?


16

Non so perché questo accada, ma carico alcuni file per Amazon S3eliminare i file inviati controllandoli md5sumsia in Amazon che localmente. Ma recentemente ho scoperto che questo problema sullo stesso contenuto sta generando due diversimd5sum

[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

Qualcuno sa perché ciò sta accadendo? O come devo verificare se i miei file sono coerenti, affidabili?

aggiornamento Rispondendo alla risposta di 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

Dà lo stesso problema a Tiago.

Risposte:


54

Secondo RFC 1952 , l' gzipintestazione del file include il tempo di modifica del file originale (campo MTIME). È possibile visualizzare l'intestazione in testo semplice 1) con 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

Quindi, se vuoi davvero confrontare i file gzip'd, comprimili con l' -nopzione, per non salvare il nome del file originale e il timestamp ,

gzip -n renew.log s3/renew.log 

e il loro md5sum dovrebbe essere identico.

Altrimenti potresti usare

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

per calcolare il md5sum dei file decompressi.


1) Tuttavia, l'ora e la data visualizzate non sono prese dall'intestazione, ma rappresentano i valori correnti; questo vale anche per il nome del 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

12

Perché ti aspetti che la versione compressa dello stesso file sia la stessa? Il programma di compressione (gzip) può includere un po 'di data e ora nell'intestazione o può usare alcuni algoritmi randomizzati.

E esattamente! L'intestazione gzip contiene il timestamp . Se vuoi che i tuoi file compressi siano gli stessi, il tuo file deve avere lo stesso timestamp!

Quindi, quando copi un file, fallo sempre come cp -p file1 file1, non solo cp file1 file2- è in realtà una cattiva abitudine!


10

Usa gzip con il 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

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


Aggiornamento la mia risposta Tiago, in generale il problema è lo stesso.
Valter Silva,

2
Usa con '-n' flag
Tiago Cruz

2
-1, questa risposta dovrebbe essere un commento (o tre)
Quel ragazzo brasiliano, il

@ ruda.almeida questa è una risposta abbastanza valida in quanto tenta di mostrare come testare e quindi risolvere il problema.
James Mertz,

2
OK, tutto prima di "usa gzip con '-n'" dovrebbe essere fatto un commento mentre sta cercando di chiarire la domanda, esattamente a cosa servono i commenti. E poi, la seconda parte è tecnicamente corretta, ma è una risposta di bassa qualità perché non spiega cosa causa il problema né perché il suggerimento proposto lo risolve.
Quel ragazzo brasiliano l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.