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"))
…
在这个问题的上下文中,“体面”仅指输出的分布:当以这种方式使用时,加密哈希函数的输出是否均匀? (虽然我认为这取决于哈希函数,但所有加密哈希值也应该具有统一的输出,对吧?)
注意:我承认,与 Mersenne-Twister 相比,由于使用了加密哈希,这将是一个缓慢的 PRNG。我对速度不感兴趣,对结果的安全性也不感兴趣——只是分布是正确的。
在我的特定用例中,我正在寻找类似于 XKCD's geohashing 的内容,因为它很容易被分布式各方实现,他们都会得到相同的答案。 Mersenne-Twister 可以被替代,但它在许多目标语言中不太可用。 (有些语言完全缺乏它,有些语言无法访问它的原始 U32 输出,等等。SHA512 要么是内置的,要么很容易获得。)
最佳答案
假设加密哈希函数满足其设计目标,输出将(可证明)在其周期内遵循均匀分布,因为哈希函数的每个输入在设计上都是唯一的。
哈希函数的目标之一是近似随机预言,也就是说,对于任何两个不同的输入 A 和 B,输出 H(A) 和 H(B) 应该(对于真正的随机预言)为不相关的。哈希函数非常接近这一点,但随着时间和密码分析的进行,弱点当然会逐渐显现。
也就是说,就质量而言,加密原语本质上是我们可用的最好的数学算法,因此可以肯定地说,如果它们不能解决您的问题,什么都可以解决。
关于hash - 加密哈希算法可以用作 PRNG 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467805/