在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

回到顶部