在PHP中生成加密安全的随机数
PHP的rand()
函数不能提供良好的随机数。因此,我开始使用mt_rand()
据说效果更好的产品。但是这些结果有多好?有什么方法可以再次改善它们?
我的点子:
function rand_best($min, $max) { $generated = array();
for ($i = 0; $i < 100; $i++) {
$generated[] = mt_rand($min, $max);
}
shuffle($generated);
$position = mt_rand(0, 99);
return $generated[$position];
}
这应该给您“完美的”随机数,不是吗?
回答:
伪随机数生成器(PRNG)是非常复杂的野兽。
没有真正的“完美”随机数生成器-实际上,可以通过数学函数完成的最好的操作是伪随机数-对于大多数意图和目的,它们似乎足够随机。
实际上,从PRNG返回的数字中执行任何其他操作并不会真正增加其随机性,并且实际上,数字的随机性会降低。
因此,我最好的建议是,不要弄乱PRNG返回的值。使用足以满足预期用途的PRNG,如果不是,则在必要时找到可以产生更好结果的PRNG。
坦率地说,该mt_rand
函数似乎使用了Mersennetwister,它实际上是一个非常不错的PRNG,因此对于大多数临时使用来说可能已经足够好了。
但是, 。
评论中有一个问题,为什么对随机数执行运算可以使随机性降低。例如,某些PRNG可以在比特的不同部分返回更一致,更少的随机数-高端可能比低端更多。
因此,在丢弃高端并返回低端的操作中,该值的随机性可能小于从PRNG返回的原始值。
目前,我找不到很好的解释,但是我基于Java文档中的Random.nextInt(int)
方法进行了解释,该方法旨在在指定范围内创建一个相当随机的值。该方法考虑了值各部分的随机性差异,因此与诸如的更幼稚的实现相比,它可以返回更好的随机数rand()% range
。
以上是 在PHP中生成加密安全的随机数 的全部内容, 来源链接: utcz.com/qa/423526.html