我曾经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 脚本很短,里面有这个小东西:也就是说,如果文件的路径名包含八个连续的十六进制数字,前后至少有一个非十六进制数字,则将此十六进制数字与文件的 CRC32 校验和进行比较。
在您的情况下,您正在
crc32
运行./9836Feeding_the_dog_.mpeg
. 此路径名包含一些非十六进制数字 (./
),后跟正好八个十六进制数字 (9836Feed
),然后是非十六进制数字。9836Feed
不是文件的 CRC32 校验和,所以它会抱怨。触发此“不坏”行为的示例:
./
重新创建您的测试,并通过在文件的路径名前添加来引发“BAD”响应:由于
crc32
可执行文件没有记录,显然有些古怪,并且没有被广泛使用(我不知道它并且不得不追踪它,但这可能不会说太多)我建议使用其他一些工具来计算文件的校验和。来自 GNU coreutils的md5sum
工具被广泛使用,在 BSD 系统上您可以使用md5
. 还有一些用于计算更强哈希的实用程序(SHA1、SHA256 和 SHA512 以及其他可用的实用程序都支持)。(“非十六进制数字”是指“不是十六进制数字的东西”)