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

16

Não sei por que isso está acontecendo, mas carrego alguns arquivos para Amazon S3 , depois excluo os arquivos enviados, verificando seus md5sum na Amazon e localmente. Mas recentemente eu encontrei este problema sobre o mesmo conteúdo que está gerando dois md5sum

[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, confiáveis?

atualização Respondendo resposta 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á o mesmo problema Tiago.

    
por Valter Silva 10.07.2013 / 15:13

3 respostas

54

De acordo com RFC 1952 , o cabeçalho do arquivo gzip 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

Então, se você realmente quer comparar os arquivos gzip'd, comprima-os com a opção -n , para não salvar o nome do arquivo original e o registro de data e 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
    
por 10.07.2013 / 15:32
12

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

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

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

    
por 10.07.2013 / 15:32
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: link

    
por 10.07.2013 / 15:24

Tags