¿Archivos con el mismo contenido pero con diferentes md5sums cuando gzip'd?

16

No sé por qué sucede esto, pero subo algunos archivos para Amazon S3luego eliminar los archivos enviados y verificarlos md5sumen Amazon y localmente. Pero recientemente encontré que este problema sobre el mismo contenido está generando dos diferentesmd5sum

[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

¿Alguien sabe por qué sucede eso? ¿O cómo debo verificar si mis archivos son consistentes y confiables?

actualizar Respondiendo Tiago Cruz respuesta:

[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

Le da el mismo problema a Tiago.

Valter Silva
fuente

Respuestas:

54

Según RFC 1952 , el gzipencabezado del archivo incluye el tiempo de modificación del archivo original (campo MTIME). Puede mostrar el encabezado en texto sin formato 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

Entonces, si realmente desea comparar los archivos gzip'd, comprímalos con la -nopción, para no guardar el nombre del archivo original y la marca de tiempo ,

gzip -n renew.log s3/renew.log 

y su md5sum debe ser idéntico.

De lo contrario, podría usar

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

para calcular el md5sum de los archivos descomprimidos.


1) Sin embargo, la hora y la fecha mostradas no se toman del encabezado, sino que representan los valores actuales; este es también el caso del nombre del archivo:

$ 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
fuente
12

¿Por qué espera que la versión comprimida del mismo archivo sea la misma? El programa de compresión (gzip) puede incluir alguna marca de tiempo en el encabezado o puede usar algunos algoritmos aleatorios.

Y exactamente! El encabezado gzip contiene la marca de tiempo . Si desea que sus archivos comprimidos sean iguales, ¡su archivo debe tener la misma marca de tiempo!

Entonces, cuando copie un archivo, hágalo siempre como cp -p file1 file1, no solo cp file1 file2, ¡eso es realmente un mal hábito!

Tomás
fuente
10

Simplemente use gzip con la bandera '-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

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

Tiago Cruz
fuente
Actualizo mi respuesta Tiago, en general el problema es el mismo.
Valter Silva
2
Usar con la bandera '-n'
Tiago Cruz
2
-1, esta respuesta debería ser un comentario (o tres)
Ese tipo brasileño
@ ruda.almeida esta es una respuesta suficientemente válida ya que intenta mostrar cómo probar y luego solucionar el problema.
James Mertz
2
Bien, todo antes de "usar gzip con '-n'" debe hacerse un comentario ya que está tratando de aclarar la pregunta, exactamente para qué son los comentarios. Y luego, la segunda parte es técnicamente correcta, pero es una respuesta de baja calidad porque no explica qué causa el problema ni por qué la sugerencia propuesta lo resuelve.
Ese chico brasileño