为什么看似空的文件和字符串会产生md5sums?

时间:2012-06-06 07:31:55

标签: string null md5sum

请考虑以下事项:

% 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

首先,我对所有这些命令的输出感到惊讶。如果有的话,我希望它们的总和是相同的。

3 个答案:

答案 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混淆,其中零字节标记字符串的结尾)。最后一个命令是查找一个空字符串作为文件名的文件。