我正在寻找一个PRNG(伪随机),你最初用任意数组的字节种子。
听说过什么?
答案 0 :(得分:3)
散列你的任意长度的种子(而不是像建议的paxdiablo那样使用XOR)将确保冲突极不可能,即等于哈希冲突的概率,例如SHA1 / 2这是实际上不可能的。
然后你可以使用你的散列种子作为一个体面的PRNG的输入,比如我最喜欢的Mersenne Twister。
<强>更新强>
此处提供的Mersenne Twister实现似乎已接受任意长度键:http://code.msdn.microsoft.com/MersenneTwister/Release/ProjectReleases.aspx?ReleaseId=529
更新2
要分析SHA2碰撞的可能性有多大,看看有人必须努力找到一个,引用http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-2:
对SHA-2有两次中间相遇的原像攻击,轮数减少。第一轮在64轮中攻击41轮SHA-256,时间复杂度为2 ^ 253.5,空间复杂度为2 ^ 16,66轮中的46轮SHA-512,时间为2 ^ 511.5,空间为2 ^ 3 。第二个攻击42轮SHA-256,时间复杂度为2 ^ 251.7,空间复杂度为2 ^ 12,42轮SHA-512,时间为2 ^ 502,空间为2 ^ 22。
答案 1 :(得分:2)
为什么不将你的任意序列与一个正确长度的类型进行异或(如果需要,用自己的一部分填充它)?例如,如果你想要种子“paxdiablo”而你的PRNG有一个四字节的种子:
paxd 0x70617864
iabl 0x6961626c
opax 0x6f706178
----------
0x76707b70 or 0x707b7076 (Intel-endian).
我知道种子看起来是人为的(因为密钥是从字母字符中选择的)。如果你真的想让这个短语很可能来自一个相似的范围,那么再次使用0xdeadbeef
或0xa55a1248
这样的区别对象进行异或:
paxd 0x70617864 0x70617864
iabl 0x6961626c 0x6961626c
opax 0x6f706178 0x6f706178
0xdeadbeef 0xa55a1248
---------- ----------
0xa8ddc59f 0xd32a6938
我更喜欢第二个,因为它会更容易将相似的字节移动到不同的范围内(微分器中字节的高位是不同的)。