2010-01-29 18 views

回答

3

散列任意长度的种子(而不是使用XOR作为paxdiablo建议的)将确保碰撞是极不可能的,即等于散列冲突的概率,与诸如SHA1/2之类的事物相比,这实际上是不可能的。

然后,你可以使用你的散列种子作为一个像样的PRNG的输入,例如我最喜欢的Mersenne Twister。

UPDATE可以在这里

梅森倍捻机实施似乎已经接受任意长度密钥: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,80轮中有46轮SHA-512,时间为2^511.5,空间2^3 。第二次攻击的时间复杂度为2^251.7,空间复杂度为2^12的42轮SHA-256,以及时间2^502和空间2^22的42轮SHA-512。

+0

有时你会很幸运。我一直在考虑Mersenne Twister。虽然不确定实施情况。谢谢!代码需要一些修改,从现有的Random类继承是愚蠢的,除此之外,看起来不错! – 2010-02-01 22:32:17

+0

SHA256给出2^256个不同的可能哈希。为了让你知道这个数字有多大,已知宇宙中有大约2^265个原子。 – 2010-06-25 21:40:40

+0

你可以更新链接到MSDN吗?看起来这个页面已经不在那里了...... – beppe9000 2015-06-14 00:33:28

2

为什么不只是将你的任意序列异或为一个正确长度的类型(如果需要,可以用它的一部分填充它)?例如,如果你想要的种子“paxdiablo”和你的PRNG有四字节的种子:

paxd 0x70617864 
iabl 0x6961626c 
opax 0x6f706178 
     ---------- 
     0x76707b70 or 0x707b7076 (Intel-endian). 

我知道,种子看起来人工的(而且是因为关键是从字母字符选择)。如果你真的想让它不同的地方这句话很可能来自于类似的范围,具有微分再次异或像0xdeadbeef0xa55a1248

paxd 0x70617864 0x70617864 
iabl 0x6961626c 0x6961626c 
opax 0x6f706178 0x6f706178 
     0xdeadbeef 0xa55a1248 
     ---------- ---------- 
     0xa8ddc59f 0xd32a6938 

我更喜欢第二个,因为它会更容易移动相似字节分成不同的范围(差分器中字节的高位不同)。

+0

谢谢,我想到了这一点。然而,这有效地用作散列函数。所以,当我的意见更加多样化时,我会将其缩小到更小的窗口并增加碰撞的可能性。我想避免这种情况。 我见过PRNG的实现与一个较小的种子生成的支持表一起使用。但我应该可以用任何字节数组作为输入来生成这个相同的表。更大的投入,更少的碰撞机会,对吧? 这就是我想要的。 – 2010-02-01 09:20:49