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 要么是内置的,要么很容易获得。)