Filenames

為什麼 crc32 說我的一些文件是“壞的”?

  • November 12, 2018

我曾經crc32將一些文件與它們的備份進行比較。在 3556 個文件中,有 11 個被報告為“BAD”,如下例所示:

9be46354        ./9836Feeding_the_dog_.mpeg   BAD 9be46354 != 9836Feed

但是,這些文件還不錯,但由於某種原因crc32,將它計算的校驗和與文件名的一部分進行了比較。

然後我嘗試了一個實驗:

$ echo 12345 > 9836Feeding_the_dog_.mpeg
$ crc32 9836Feeding_the_dog_.mpeg
261dafe6

所以這次crc32似乎沒有將校驗和與文件名進行比較,並且文件不是’BAD’。

這裡發生了什麼?這會發生在其他校驗和上嗎?

crc32您正在使用的執行檔是與Archive::ZipPerl 模組一起分發的 Perl 腳本。

crc32Perl 腳本很短,裡面有這個小東西:

if ( $file =~ /[^[:xdigit:]]([[:xdigit:]]{8})[^[:xdigit:]]/ ) {
   my $filenameCrc = $1;
   if ( lc($filenameCrc) eq lc($fileCrc) ) {
       print("\tOK")
   } else {
       print("\tBAD $fileCrc != $filenameCrc");
   }
}

也就是說,如果文件的路徑名包含八個連續的十六進制數字,前後至少有一個非十六進制數字,則將此十六進制數字與文件的 CRC32 校驗和進行比較。

在您的情況下,您正在crc32執行./9836Feeding_the_dog_.mpeg. 此路徑名包含一些非十六進制數字 ( ./),後跟正好八個十六進制數字 ( 9836Feed),然後是非十六進制數字。 9836Feed不是文件的 CRC32 校驗和,所以它會抱怨。

觸發此“不壞”行為的範例:

$ cat 261dafe6_file
12345
$ crc32 ./261dafe6_file
261dafe6        OK

./重新創建您的測試,並通過在文件的路徑名前添加來引發“BAD”響應:

$ echo 12345 >9836Feeding_the_dog_.mpeg
$ crc32 9836Feeding_the_dog_.mpeg
261dafe6

$ crc32 ./9836Feeding_the_dog_.mpeg
261dafe6        BAD 261dafe6 != 9836Feed

由於crc32執行檔沒有記錄,顯然有些古怪,並且沒有被廣泛使用(我不知道它並且不得不追踪它,但這可能不會說太多)我建議使用其他一些工具來計算文件的校驗和。來自 GNU coreutils的md5sum工具被廣泛使用,在 BSD 系統上您可以使用md5. 還有一些用於計算更強雜湊的實用程序(SHA1、SHA256 和 SHA512 以及其他可用的實用程序都支持)。


(“非十六進制數字”是指“不是十六進制數字的東西”)

引用自:https://unix.stackexchange.com/questions/481141