考虑以下:
% 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
首先,我对所有这些命令的输出惊讶。 如果有什么事情,我希望总和是所有的人都一样。
的“无”(字符长度为零的流)的的md5sum是d41d8cd98f00b204e9800998ecf8427e,你会在你的前两个例子看到的。
第三和第四实施例的处理的单个字符。 在“回声”的情况下,这是一个换行符,即
$ echo -ne '\n' | md5sum
68b329da9893e34099c7d8ad5cb9c940 -
在perl的例子,它是用值为0x00,即单个字节
$ echo -ne '\x00' | md5sum
93b885adfe0da089cdf634904fd59f71 -
您可以使用“回声”如下重现空校验:
$ echo -n '' | md5sum
d41d8cd98f00b204e9800998ecf8427e -
...和使用Perl如下:
$ perl -e 'print ""' | md5sum
d41d8cd98f00b204e9800998ecf8427e -
在所有四种情况下,你应该期望相同的输出从执行校验的数据相同,但不同的数据应该产生一个完全不同的校验和(这是整点 - 即使它只有一个字符不同)
看似空文件和字符串为什么产生MD5SUMS?
因为“ 和 ”在的md5sum是有点误导。 它不象如CRC32校验,这是空文件为零。
MD5是消息摘要算法之一。 你可以把它想象成产生取决于其内部状态固定长度的随机前瞻性值(散)一箱。 您可以通过在数据反馈改变内部状态。
和该框内部状态被预定义,使得它产生随机寻找甚至之前的任何数据在进给的哈希值。对于MD5,它正好是d41d8cd98f00b204e9800998ecf8427e
。
无需惊讶。 前两个产生真正的空输入MD5SUM。 回声产生一个换行符( echo -n ''
应该产生一个空的输出;我没有一台Linux机器此处查看)。 该perl产生单个零字节(未用C相混淆一个零字节标记串的终点)。 最后一个命令正在寻找与空字符串作为其文件名的文件。