5

MD5/SHA256/SHA512等可以作为PRNG吗?例如,给定一个整数种子,是伪代码:

random_number = truncate_to_desired_range(
    sha512( seed.toString() + ',' + i.toString() )

......一个体面的PRNG?(i是一个递增的整数,例如,输出是:

convert(sha512("<seed>,0"))
convert(sha512("<seed>,1"))
convert(sha512("<seed>,2"))
convert(sha512("<seed>,3"))
…

在这个问题的上下文中,“体面”仅指输出的分布:当以这种方式使用时,密码散列函数的输出是否均匀?(虽然我认为这取决于散列函数,但所有加密散列也应该有统一的输出,对吧?)

注意:我承认这将是一个缓慢的 PRNG,与 Mersenne-Twister 相比,由于使用了加密哈希。我对速度不感兴趣,我对结果是否安全也不感兴趣——只是分布是正确的。

在我的特定用例中,我正在寻找类似于XKCD 的 geohashing 的东西,因为它很容易由分布式各方实现,他们都会得到相同的答案。Mersenne-Twister 可以被替代,但它在许多目标语言中不太可用。(有些语言完全没有它,有些语言无法访问它的原始 U32 输出,等等。SHA512 要么是内置的,要么很容易获得。)

4

2 回答 2

4

假设加密散列函数满足其设计目标,输出将(可证明)在其周期内遵循均匀分布,因为散列函数的每个输入在设计上都是唯一的。

散列函数的目标之一是近似随机预言,也就是说,对于任何两个不同的输入 A 和 B,输出 H(A) 和 H(B) 应该(对于真正的随机预言)是不相关的。散列函数非常接近这一点,但随着时间和密码分析,弱点当然会逐渐消失。

也就是说,就质量而言,加密原语本质上是我们可用的最好的数学算法,因此可以肯定地说,如果它们不能解决您的问题,那就什么也做不了。

于 2013-01-22T21:06:36.143 回答
0

它可以工作(如其他答案/评论中提到的那样,具有良好大小的输入、填充等)并且会提供相当好的结果,但它会很,所以如果你正在做模拟,请不要这样做或需要大量使用 PRNG 的东西......

于 2013-01-22T21:10:39.227 回答