52

考虑以下:

% 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

首先,我对所有这些命令的输出感到惊讶。如果有的话,我希望他们所有人的总和都是一样的。

4

3 回答 3

100

“无”(零长度字符流)的 md5sum 是 d41d8cd98f00b204e9800998ecf8427e,您在前两个示例中看到了它。

第三个和第四个例子是处理单个字符。在“回声”的情况下,它是一个换行符,即

$ echo -ne '\n' | md5sum
68b329da9893e34099c7d8ad5cb9c940 -

在 perl 示例中,它是一个值为 0x00 的单字节,即

$ echo -ne '\x00' | md5sum
93b885adfe0da089cdf634904fd59f71 -

您可以使用“echo”重现空校验和,如下所示:

$ echo -n '' | md5sum
d41d8cd98f00b204e9800998ecf8427e -

...并使用 Perl 如下:

$ perl -e 'print ""' | md5sum
d41d8cd98f00b204e9800998ecf8427e  -

在所有四种情况下,您应该期望对相同数据进行校验和得到相同的输出,但不同的数据应该会产生截然不同的校验和(这就是重点——即使它只是一个不同的字符。)

于 2012-06-06T07:39:45.787 回答
17

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

因为md5sum中的“ sum ”有些误导。它不像CRC32校验和,对于空文件为零。

MD5 是一种消息摘要算法。你可以把它想象成一个盒子,它根据内部状态产生固定长度的随机值(散列)。您可以通过输入数据来更改内部状态。

并且该盒子的内部状态是预定义的,因此即使在输入任何数据之前它也会产生随机外观的哈希值。对于 MD5,它恰好是d41d8cd98f00b204e9800998ecf8427e.

于 2014-12-15T21:51:55.387 回答
3

不需要惊喜。前两个产生真正的空输入到 md5sum。echo 产生一个换行符(echo -n ''应该产生一个空输出;我这里没有 linux 机器可以检查)。perl 产生单个零字节(不要与 C 混淆,其中零字节标记字符串的结尾)。最后一个命令正在寻找一个以空字符串作为文件名的文件。

于 2012-06-06T07:46:16.720 回答