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

Mic*_*ler 4 php

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

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

Thi*_*ter 6

主要是因为这是PHP的方式.就像他们添加mysql_real_escape_string而不是替换mysql_escape_string它.

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

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

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