Filenames
為什麼 crc32 說我的一些文件是“壞的”?
我曾經
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::Zip
Perl 模組一起分發的 Perl 腳本。
crc32
Perl 腳本很短,裡面有這個小東西: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 以及其他可用的實用程序都支持)。(“非十六進制數字”是指“不是十六進制數字的東西”)