请考虑以下事项:
% md5sum /dev/null
d41d8cd98f00b204e9800998ecf8427e /dev/null
% touch empty; md5sum empty
d41d8cd98f00b204e9800998ecf8427e empty
% echo '' | md5sum
68b329da9893e34099c7d8ad5cb9c940 -
% perl -e 'print chr(0)' | md5sum
93b885adfe0da089cdf634904fd59f71 -
% md5sum ''
md5sum: : No such file or directory
首先,我对所有这些命令的输出感到惊讶。如果有的话,我希望它们的总和是相同的。
答案 0 :(得分:72)
md5sum的“无”(零长度的字符流)是d41d8cd98f00b204e9800998ecf8427e,你在前两个例子中看到了。
第三和第四个例子正在处理单个字符。在“echo”的情况下,它是一个换行符,即
$ echo -ne '\n' | md5sum
68b329da9893e34099c7d8ad5cb9c940 -
在perl示例中,它是一个值为0x00的单字节,即
$ echo -ne '\x00' | md5sum
93b885adfe0da089cdf634904fd59f71 -
您可以使用“echo”重现空校验和,如下所示:
$ echo -n '' | md5sum
d41d8cd98f00b204e9800998ecf8427e -
...并使用Perl如下:
$ perl -e 'print ""' | md5sum
d41d8cd98f00b204e9800998ecf8427e -
在所有四种情况下,你应该期望校验和相同数据的输出相同,但不同的数据应该产生一个完全不同的校验和(这就是重点 - 即使它只是一个不同的单个字符。)
答案 1 :(得分:11)
为什么看似空的文件和字符串会产生md5sums?
因为 md5sum 中的“ sum ”有些误导。它不像例如CRC32校验和,对于空文件为零。
MD5是消息摘要算法之一。你可以把它想象成一个盒子,根据它的内部状态产生固定长度的随机值(哈希)。您可以通过输入数据来更改内部状态。
并且该框内部状态是预定义的,这样即使在输入任何数据之前它也会产生随机查看的哈希值。对于MD5,它恰好是d41d8cd98f00b204e9800998ecf8427e
。
答案 2 :(得分:2)
无需惊喜。前两个产生md5sum的真空输入。 echo产生一个换行符(echo -n ''
应该产生一个空输出;我没有这里的linux机器来检查)。 perl产生一个零字节(不要与C混淆,其中零字节标记字符串的结尾)。最后一个命令是查找一个空字符串作为文件名的文件。