Arquivos com o mesmo conteúdo, mas com md5sums diferentes quando compactados com gzip?

16

Não sei por que isso está acontecendo, mas carrego alguns arquivos para Amazon S3excluir os arquivos enviados, verificando md5sumambos na Amazon e localmente. Mas, recentemente, achei esse problema sobre o mesmo conteúdo que está gerando dois 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

Alguém sabe por que isso está acontecendo? Ou como devo verificar se meus arquivos são consistentes e confiáveis?

atualizar Respondendo Tiago Cruz resposta:

[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á o mesmo problema, Tiago.

Valter Silva
fonte

Respostas:

54

De acordo com a RFC 1952 , o gzipcabeçalho do arquivo inclui o tempo de modificação do arquivo original (campo MTIME). Você pode exibir o cabeçalho em texto simples 1) com 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

Portanto, se você realmente deseja comparar os arquivos compactados com gzip, compacte-os com a -nopção, para não salvar o nome do arquivo original e o carimbo de data / hora ,

gzip -n renew.log s3/renew.log 

e seu md5sum deve ser idêntico.

Caso contrário, você poderia usar

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

para calcular o md5sum dos arquivos descompactados.


1) No entanto, a hora e a data exibidas não são obtidas do cabeçalho, mas representam os valores atuais; este também é o caso do nome do arquivo:

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

Por que você espera que a versão compactada do mesmo arquivo seja a mesma? O programa de compactação (gzip) pode incluir algum carimbo de data / hora no cabeçalho ou pode usar alguns algoritmos aleatórios.

E exatamente! O cabeçalho gzip contém o registro de data e hora . Se você deseja que seus arquivos compactados sejam iguais, seu arquivo deve ter o mesmo registro de data e hora!

Portanto, quando você copia um arquivo, faça-o sempre cp -p file1 file1e não apenas cp file1 file2- isso é realmente um mau hábito!

Tomas
fonte
10

Basta usar o gzip com o sinalizador '-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

Tiago Cruz
fonte
Eu atualizo minha resposta Tiago, em geral o problema é o mesmo.
Valter Silva
2
Use com '-n' flag
Tiago Cruz
2
-1, esta resposta deve ser um comentário (ou três)
Esse cara brasileiro
@ ruda.almeida, essa é uma resposta válida o suficiente, pois tenta mostrar como testar e, em seguida, corrigir o problema.
22613 James Mertz
2
OK, tudo antes de "usar gzip com '-n'" deve ser feito um comentário, pois ele está tentando esclarecer a pergunta, exatamente para que servem os comentários. E então, a segunda parte é tecnicamente correta, mas é uma resposta de baixa qualidade, porque não explica o que causa o problema nem por que a sugestão proposta o resolve.
Aquele cara brasileiro