PHP 8.3 默认采用自动分层随机机制:安全整数用 random_int(),可控序列用 Randomizer 配合 Xoshiro256StarStar 等引擎,随机字节用 random_bytes();mt_rand() 和 mt_srand() 已废弃。

PHP 8.3 中已不再通过手动选择算法(如调用 mt_srand() 或设置种子)来切换随机数生成逻辑。它默认使用现代、分层的随机机制,核心是按用途自动匹配最合适的底层引擎,而非让用户“选算法”。
安全整数:用 random_int(),不选算法
生成密码、令牌、会话 ID 等敏感值时,直接调用:
-
random_int($min, $max)—— 它内部自动使用操作系统密码学安全源(/dev/urandom、getrandom(2)或 Windows Crypto API),无需指定算法 - 不要尝试用
mt_rand()或rand()替代,它们不具备加密安全性
可控随机序列:用 Randomizer + 引擎类
当你需要可重现、可配置的非安全随机行为(比如游戏模拟、测试数据、蒙特卡洛仿真),PHP 8.3 提供了 Randomizer 类和明确的引擎选项:
-
$r = new Randomizer(new \Random\Engine\Xoshiro256StarStar(12345));—— 使用 256 位种子、极低碰撞概率的高质量引擎 -
$r = new Randomizer(new \Random\Engine\PcgOneseq128Xslrr64(67890));—— 另一种高周期、低偏差的现代引擎 -
$r = new Randomizer(new \Random\Engine\Secure());—— 虽然名字含 “Secure”,但它仍基于系统熵源,适用于需高不可预测性但不严格要求 FIPS 合规的场景
注意:mt_rand() 和 mt_srand() 在 PHP 8.3 已被废弃,不能作为引擎传入 Randomizer。
立即学习“PHP免费学习笔记(深入)”;
随机字节:用 random_bytes(),底层自动 fallback
生成密钥、盐值、初始化向量等原始字节时,只用:
-
random_bytes(32)—— PHP 8.3 默认优先调用getrandom(2)系统调用;若不可用,自动降级到/dev/urandom(Linux)或CryptGenRandom(Windows) - 无需、也无法指定“用哪种算法”,它的安全性由系统保障,不是 PHP 实现决定的
避免踩坑的关键点
-
mt_srand()和srand()已废弃,调用会触发E_DEPRECATED警告,不要用 - 不要对
random_bytes()结果取模生成整数(如random_bytes(1)[0] % 100),会导致分布偏差;该场景请无条件改用random_int() -
openssl_random_pseudo_bytes()仍可用,但功能已被random_bytes()全面覆盖,新项目无需引入 OpenSSL 依赖



















