哈希(md5,sha1)的任何子串都比另一个更“随机”吗?

时间:2010-09-29 07:54:23

标签: md5 sha1 hashcode sha256

这是md5哈希的3个示例

$ md5 -s "1" && md5 -s "2" && md5 -s "3"
MD5 ("1") = c4ca4238a0b923820dcc509a6f75849b
MD5 ("2") = c81e728d9d4c2f636f067f89cc14862c
MD5 ("3") = eccbc87e4b5ce2fe28308fd9f2a7baf3

说我想从任何哈希中取8个字符。哈希的开头部分是否比结尾更“随机”?中间?或者所有子串都是“随机”的?

4 个答案:

答案 0 :(得分:18)

我自己很好奇,所以我继续写了program来测试这个。您需要Crypto++来编译代码。

声明: 当谈到密码学,或者甚至只是数学时,我知道足以让自己陷入困境。因此,请考虑以下结果,并记住我只对我正在使用的工具有一个粗略的了解。

我只采样了三个子串:前8个字​​节,中间8个字节和后8个字节。长话短说,它们同样是随机的。

但是,当使用较小的样本空间时,似乎最后8位稍微更随机。采样空间越大,所有三个子串越接近完全随机性。


1000次迭代:

First:  0.995914
Middle: 0.996546
Last:   0.998104

5000次迭代:

First:  0.998387
Middle: 0.998624
Last:   0.999501

10000次迭代:

First:  0.999614
Middle: 0.999457
Last:   1

30000次迭代:

First:  1
Middle: 1
Last:   1

“随机性”由Crypto ++的MaurerRandomnessTest类测量。作为参考,从上面的代码编译的可执行文件的随机性值为0.632411,从Project Gutenburg下载的莎士比亚的Macbeth副本的随机性值为0.566991

答案 1 :(得分:11)

良好散列的所有子串(并且md5尽管在加密方面是不安全的但是相当好)同样是随机的,所以是的,从字符串中取出你喜欢的任何位,它们应该是均匀分布的。

答案 2 :(得分:10)

Nitpick:“随机”是这里使用的错误词,因为哈希函数是确定性的。

至于回答你的意思:),散列函数的理想属性是实现Avalanche effect:基本上,让每一位输入都会导致输出发生剧烈变化。因此,对于设计良好的哈希,每个子字符串应该与其他子字符串一样经常受到影响(“随机”)。

答案 3 :(得分:0)

可以使用在伪随机数生成器上进行的统计测试来测量散列函数输出的随机性。 根据{{​​3}}§5.4.4(免费提供的样本章节),有五个基本测试:

  1. 频率测试(单比特测试)
  2. 串行测试(两位测试)
  3. 扑克测试
  4. 运行测试
  5. 自相关测试
  6. 然后,当然,kurige已经提到了Maurer的普遍统计测试。