Fichiers avec le même contenu mais avec des sommes md5 différentes lorsque gzip'd?


16

Je ne sais pas pourquoi cela se produit, mais je télécharge des fichiers pour Amazon S3ensuite supprimer les fichiers envoyés en les vérifiant à la md5sumfois sur Amazon et localement. Mais récemment, j'ai trouvé que ce problème concernant le même contenu générait deuxmd5sum

[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

Est-ce que quelqu'un sait pourquoi cela se produit? Ou comment dois-je vérifier si mes fichiers sont cohérents et fiables?

Mise à jour de la réponse de 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

Cela donne le même problème à Tiago.

Réponses:


54

Selon la RFC 1952 , l' gzipen-tête de fichier inclut l' heure de modification du fichier d'origine (champ MTIME). Vous pouvez afficher l'en-tête en texte clair 1) avec 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

Donc, si vous voulez vraiment comparer les fichiers compressés, compressez-les avec l' -noption, pour ne pas enregistrer le nom de fichier d'origine et l'horodatage ,

gzip -n renew.log s3/renew.log 

et leur somme md5 doit être identique.

Sinon, vous pourriez utiliser

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

pour calculer la somme md5 des fichiers décompressés.


1) Cependant, l'heure et la date affichées ne sont pas extraites de l'en-tête, mais représentent les valeurs actuelles; c'est aussi le cas pour le nom de fichier:

$ 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

Pourquoi vous attendez-vous à ce que la version compressée du même fichier soit la même? Le programme de compression (gzip) peut inclure un horodatage dans l'en-tête ou peut utiliser des algorithmes randomisés.

Et exactement! L'en-tête gzip contient l'horodatage . Si vous voulez que vos fichiers compressés soient les mêmes, votre fichier doit avoir le même horodatage!

Ainsi, lorsque vous copiez un fichier, faites-le toujours comme cp -p file1 file1, pas seulement cp file1 file2- c'est en fait une mauvaise habitude!


10

Utilisez simplement gzip avec le drapeau '-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

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


Je mets à jour ma réponse Tiago, en général le problème est le même.
Valter Silva

2
Utiliser avec le drapeau '-n'
Tiago Cruz

2
-1, cette réponse devrait être un commentaire (ou trois)
Que le brésilien Guy

@ ruda.almeida c'est une réponse suffisamment valable car elle tente de montrer comment tester, puis de résoudre le problème.
James Mertz

2
OK, tout ce qui se trouve avant "utiliser gzip avec '-n'" doit faire un commentaire car il essaie de clarifier la question, exactement à quoi servent les commentaires. Et puis, la deuxième partie est techniquement correcte, mais c'est une réponse de faible qualité car elle n'explique pas ce qui cause le problème ni pourquoi la suggestion proposée le résout.
Ce brésilien Guy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.