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

时间:2013-01-22 20:53:43

标签: 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"))
…

“Decent”,在这个问题的上下文中,仅指输出的分布:加密哈希函数的输出是否均匀,何时使用? (虽然我认为它取决于哈希函数,所有加密哈希值也应该有统一的输出,对吗?)

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

在我的特定用例中,我正在寻找类似于XKCD's geohashing的东西,因为它很容易被分布式派对实现,他们都会得到相同的答案。 Mersenne-Twister可以替代,但在许多目标语言中不太可用。 (有些语言完全缺乏它,有些语言无法访问它的原始U32输出等.SHA512既可以内置,也可以轻松使用。)

2 个答案:

答案 0 :(得分:3)

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

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

也就是说,加密原语本质上是我们在质量方面可用的最佳数学算法,因此可以肯定地说,如果它们无法解决您的问题,没有会。

答案 1 :(得分:0)

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