hash - 加密哈希算法可以用作 PRNG 吗?

标签 hash random prng

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/

相关文章:

php - 使用 PHP 对用户密码进行哈希处理和加盐处理

android - 生成 apk 后 key 散列无效以及如何为许多设备解决此问题?

java - 有效地散列目录中的所有文件(1000 个 2MB 文件)

algorithm - SHA-2 的空间和时间复杂度

java - Java中的随机可逆矩阵

java - 将 SecureRandom 与 SHA-256 结合使用

c++ - 二维网格中的不同随机点

arrays - 如何在golang中对数组中的字符串进行打乱?

random - 随机和随机之间的区别

不能完全理解 1992 年 Schneier 的这个简单的伪随机生成器