基于随机种子的哈希函数的输出有多随机?

时间:2013-10-02 08:52:27

标签: random hash

我想要一个伪随机的位源,我可以通过索引查看;我的特定用例是播放列表的随机重播,我希望能够回放到早期的歌曲而不存储首先播放歌曲的顺序。大多数RNG使用的状态使用生成的每个新随机数进行修改,并且不容易检索先前的状态。

现在我有了这个想法:如果种子使用某种排序,并从中计算哈希码。在哈希码中的比特用完之后,增加种子,并计算下一个哈希值。由于种子只能被可逆地修改,因此可以检索较旧的哈希码,因此可以检索“随机”位。

现在我的实际问题:从理论的角度来看这是多么随机?它对音乐播放列表并不重要,但我仍然对它感兴趣。我还可以想象一下公平性会受到关注的计算机游戏应用程序。

显然,涉及的熵不多,但是(加密)散列函数应该在单个位的变化上具有完全不同的输出。我可以通过对种子进行一些其他可逆操作来提高随机性,而不是增加一个吗?

1 个答案:

答案 0 :(得分:2)

好主意。如果你想生成很多随机数,也许有点矫枉过正。

如果结果真的是“随机”,则取决于您使用的加密算法。好的(SHA,...)将给出具有相同分布的结果。均等分布是此类算法的要求之一。

请记住,加密/哈希算法比随机数生成器更复杂。因此,产生大量此类数字将是一个问题。这可能会影响游戏,可能没有问题来生成播放列表。

顺便说一句:你见过Collections.shuffle()吗?它可能会让你的生活变得轻松。