随机数函数的目的是得到 - 你猜对了 - 一个随机数,你无法预测的东西(或者很难确定地预测)。如果mt_rand()
函数比旧rand()
更快且更不可预测(更“随机”),为什么不将基础实现切换到新方法?
换句话说,如果/因为底层实现发生了变化,使用rand()
的哪种程序会在更高版本的PHP中中断?
答案 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()
都是相同的功能。