Eu costumava crc32
comparar alguns arquivos com um backup deles. Dos 3.556 arquivos, 11 foram relatados como 'RUIM' como no exemplo a seguir:
9be46354 ./9836Feeding_the_dog_.mpeg BAD 9be46354 != 9836Feed
No entanto, os arquivos não são ruins, mas por algum motivo crc32
comparou a soma de verificação calculada com parte do nome do arquivo.
Fiz então um experimento:
$ echo 12345 > 9836Feeding_the_dog_.mpeg
$ crc32 9836Feeding_the_dog_.mpeg
261dafe6
Portanto, desta vez crc32
parece não ter comparado a soma de verificação com o nome do arquivo, e o arquivo não é 'RUIM'.
O que esta acontecendo aqui? Isso acontece com outras somas de verificação?
O
crc32
executável que você está usando é um script Perl distribuído junto com oArchive::Zip
módulo Perl.O
crc32
script Perl é bem curto e tem essa coisinha nele:Ou seja, se o nome do caminho do arquivo contém oito dígitos hexadecimais consecutivos, precedidos e seguidos por pelo menos um dígito não hexadecimal, esse número hexadecimal é comparado com a soma de verificação CRC32 do arquivo.
No seu caso, você está executando
crc32
em./9836Feeding_the_dog_.mpeg
. Este nome de caminho contém alguns dígitos não hexadecimais (./
) seguidos por exatamente oito dígitos hexadecimais (9836Feed
) e então algo não hexadecimal novamente.9836Feed
não é o checksum CRC32 do arquivo, então ele reclama.Exemplo que aciona esse comportamento que "não é RUIM":
Recriando seu teste e provocando a resposta "BAD" adicionando
./
na frente do nome do caminho do arquivo:Como o
crc32
executável não está documentado, obviamente um pouco peculiar e não é amplamente usado (eu não sabia disso e tive que rastreá-lo, mas isso pode não dizer muito), sugiro usar alguma outra ferramenta para calcular as somas de verificação dos arquivos. Amd5sum
ferramenta do GNU coreutils é amplamente utilizada, e em sistemas BSD você pode usarmd5
. Há também utilitários para calcular hashes mais fortes (SHA1, SHA256 e SHA512 e outros são suportados por utilitários prontamente disponíveis).(Por "dígito não hexadecimal" quero dizer "algo que não é um dígito hexadecimal")