如果PHP';s的mt_rand()使用了比rand()更快的算法,为什么不直接更改rand(()以使用较新的实现


If PHP's mt_rand() uses a faster algorithm than rand(), why not just change rand() to use the newer implementation?

随机数函数的目的是得到——你猜对了——一个随机数,一个你无法预测(或者很难确定预测)的数字。如果mt_rand()函数比旧的rand()更快、更不可预测(更"随机"),为什么不将底层实现切换到新方法呢?

换句话说,如果/因为底层实现发生了变化,那么使用rand()的程序在PHP的后续版本中会中断什么样的程序?

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

然而,这也可能与Mersene twister算法的缺点有关(我不知道它们是否也存在于rand()算法中):

原生形式的算法不适用于密码学(与Blum-Blum-Shub不同)。观察足够数量的迭代(在MT19937的情况下为624,因为这个数字是产生未来迭代的状态向量的大小)允许预测所有未来迭代。Makoto Matsumoto等人提出了一对基于Mersenne twister输出的加密流密码。作者声称在计数器模式下的速度比高级加密标准快1.5到2倍wikipedia

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

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

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