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

mač*_*ček 21 md5 sha1 hashcode sha256

这是md5哈希的3个示例

$ md5 -s "1" && md5 -s "2" && md5 -s "3"
MD5 ("1") = c4ca4238a0b923820dcc509a6f75849b
MD5 ("2") = c81e728d9d4c2f636f067f89cc14862c
MD5 ("3") = eccbc87e4b5ce2fe28308fd9f2a7baf3
Run Code Online (Sandbox Code Playgroud)

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

kur*_*ige 19

我自己很好奇,所以我继续写了一个程序来测试它.你需要Crypto ++来编译代码.

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

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

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


1000次迭代:

First:  0.995914
Middle: 0.996546
Last:   0.998104
Run Code Online (Sandbox Code Playgroud)

5000次迭代:

First:  0.998387
Middle: 0.998624
Last:   0.999501
Run Code Online (Sandbox Code Playgroud)

10000次迭代:

First:  0.999614
Middle: 0.999457
Last:   1
Run Code Online (Sandbox Code Playgroud)

30000次迭代:

First:  1
Middle: 1
Last:   1
Run Code Online (Sandbox Code Playgroud)

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


Gin*_*kas 11

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


sne*_*rch 11

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

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