随机数函数的目的是得到——你猜对了——一个随机数,你无法预测(或者很难确定地预测)。如果mt_rand()
函数比旧的更快且更不可预测(更“随机”)rand()
,为什么不将底层实现切换到新方法呢?
换句话说,rand()
如果/因为底层实现发生了变化,使用什么样的程序会在更高版本的 PHP 中中断?
随机数函数的目的是得到——你猜对了——一个随机数,你无法预测(或者很难确定地预测)。如果mt_rand()
函数比旧的更快且更不可预测(更“随机”)rand()
,为什么不将底层实现切换到新方法呢?
换句话说,rand()
如果/因为底层实现发生了变化,使用什么样的程序会在更高版本的 PHP 中中断?
主要是因为那是PHP 方式。就像他们添加mysql_real_escape_string
而不是替换mysql_escape_string
它一样。
但是,它也可能与 mersenne-twister 算法的缺点有关(我不知道它们是否也存在于rand()
算法中):
本机形式的算法不适用于密码学(与 Blum Blum Shub 不同)。观察足够数量的迭代(在 MT19937 的情况下为 624,因为这个数字是产生未来迭代的状态向量的大小)允许人们预测所有未来的迭代。Makoto Matsumoto 等人提出了一对基于 Mersenne twister 输出的密码流密码。作者声称在计数器模式下速度比高级加密标准快 1.5 到 2 倍。维基百科
另一个问题是,将非随机初始状态(特别是存在许多零)转换为通过随机性测试的输出可能需要很长时间。小型滞后 Fibonacci 生成器或线性同余生成器启动得更快,通常用于为 Mersenne Twister 播种随机初始值。维基百科
两种算法都是伪随机的。这意味着知道初始条件可以知道所有未来的迭代。不可能知道有人是否依赖于这样的实现细节(即依赖于函数的实现而不是函数的意图),因此创建一个新函数更安全。
最后从 PHP 7.1 开始,两者rand()
和mt_rand()
是相同的功能。