PHP 7 默认使用梅森旋转算法(Mt19937)作为 rand() 和 mt_rand() 的共享随机数生成引擎,周期长、速度快但不安全;加密场景须用 random_int() 等 CSPRNG 函数。

PHP 7 默认使用 梅森旋转算法(Mersenne Twister) 作为随机数生成器的核心算法,具体是 mt_rand() 所基于的 Mt19937 实现。
rand() 和 mt_rand() 共享同一底层引擎
自 PHP 7.1.0 起,rand() 不再调用旧的 libc rand(),而是直接委托给 mt_rand() 的梅森旋转实现。这意味着:
- 两者都使用相同的全局
Mt19937状态 - 调用任一函数都会推进该共享随机序列
-
rand($min, $max)和mt_rand($min, $max)在行为和输出上已基本一致
梅森旋转的特点
它是一种高质量伪随机数生成器(PRNG),具备以下特性:
- 周期极长(2¹⁹⁹³⁷ − 1),实践中不会重复
- 在多维空间中具有良好的均匀分布性
- 速度快,适合一般业务场景(如分页、抽奖、临时标识)
- 但不满足密码学安全要求,不可用于生成密钥、Token 或验证码等敏感用途
加密安全场景应使用 random_int()
若需真正不可预测、防猜测的随机数(例如 API 密钥、重置令牌),必须使用:
立即学习“PHP免费学习笔记(深入)”;
-
random_int($min, $max):直接调用操作系统级 CSPRNG(如 Linuxgetrandom()、Windows CNG) - 该函数与梅森旋转无关,完全独立,且从 PHP 7.0 起原生支持
其他相关函数也受此影响
shuffle() 和 str_shuffle() 在 PHP 7.1+ 同样切换为基于梅森旋转,不再依赖 libc。但它们仍属于 PRNG 范畴,不适用于安全敏感操作。



















