如果PHP的mt_rand()使用比rand()更快的算法,为什么不改变rand()来使用更新的实现呢?

时间:2012-07-17 17:49:12

标签: php

随机数函数的目的是得到 - 你猜对了 - 一个随机数,你无法预测的东西(或者很难确定地预测)。如果mt_rand()函数比旧rand()更快且更不可预测(更“随机”),为什么不将基础实现切换到新方法?

换句话说,如果/因为底层实现发生了变化,使用rand()的哪种程序会在更高版本的PHP中中断?

3 个答案:

答案 0 :(得分:6)

主要是因为那是 PHP方式。就像他们添加mysql_real_escape_string而不是用它替换mysql_escape_string一样。

然而,它也可能与mersenne-twister算法的缺点有关(我不知道它们是否也出现在rand()算法中):

  

本机形式的算法不适合加密(与Blum Blum Shub不同)。观察足够数量的迭代(在MT19937的情况下为624,因为该数字是从中产生未来迭代的状态向量的大小)允许人们预测所有未来的迭代。 Makoto Matsumoto等人提出了一种基于梅森捻线机输出的密码流密码。作者声称在计数器模式下速度比高级加密标准快1.5至2倍。 wikipedia

     

另一个问题是,将非随机初始状态(特别是存在多个零)转换为通过随机性测试的输出可能需要很长时间。一个小的滞后Fibonacci发生器或线性同余发生器启动得更快,通常用于随机初始值播种Mersenne Twister。 wikipedia

答案 1 :(得分:3)

两种算法都是伪随机的。这意味着了解初始条件可以了解所有未来的迭代。不可能知道是否有人依赖于这样的实现细节(即依赖函数的实现而不是函数的 intent ),因此它更安全创建一个新功能。

答案 2 :(得分:-1)

最后,从PHP 7.1开始,rand()mt_rand()都是相同的功能。