【问题标题】:how random is a hash function's output based on a random seed?基于随机种子的哈希函数的输出有多随机?
【发布时间】:2013-10-02 08:52:27
【问题描述】:

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

现在我有了这个想法:使用某种类型的种子,并从中计算出哈希码。在哈希码中的位用完后,增加种子,并计算下一个哈希。由于种子只是可逆地修改,因此可以检索较旧的哈希码,因此可以检索“随机”位。

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

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

【问题讨论】:

  • security.stackexchange.com 的人可能更有能力回答有关哈希的任何问题。但一般来说,好的散列被构造为均匀分布,因此输入中的微小变化会导致非常不同的散列。所以我想你可以说你只增加一个就可以了。

标签: random hash


【解决方案1】:

好主意。如果您想生成大量随机数,可能有点矫枉过正。

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

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

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

【讨论】:

  • 感谢您的发言!我知道就性能而言,这不是最好的主意,但正如您所说,对于我的用例而言,这可以忽略不计。另外,当我谈论游戏时,我主要想到的是回合制游戏,其中撤消是有意义的,主要是纸牌游戏。我知道 Collections.shuffle(),尽管我认为这在问题方面并不重要。当然,对于播放列表用例,在重复之前播放所有歌曲可能是有意义的。尽管即使那样,您也需要一种方法来取消播放列表的随机播放,或者将排列与实际播放列表分开存储......无论如何,那是 OT ;)
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 2023-03-18
  • 2018-08-25
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多