str_shuffle() 用于生成简单随机验证码,但不安全、不支持多字节字符;推荐用 random_int() 配合自定义字符集实现更安全、稳定的验证码生成。

str_shuffle() 函数能随机打乱字符串中每个字符的位置,适合生成简单、无逻辑的随机验证码(如纯字母数字组合),但不适用于需要密码学安全性的场景(比如登录令牌、API密钥)。
str_shuffle() 基本用法和原理
它接收一个字符串,返回该字符串所有字符顺序被完全随机重排后的新字符串。底层基于 libc 的 rand(),非加密安全,且每次调用结果不可预测但可复现(取决于随机数种子)。
- 只处理字符串,传入数组或数字会触发警告并返回空字符串
- 中文、emoji 等多字节字符可能被截断(因按字节打乱,非按字符),不推荐用于含 UTF-8 多字节内容的场景
- 原字符串不会被修改,返回全新字符串
生成4–6位字母+数字验证码
先拼接所需字符集(如大小写字母 + 数字),再用 str_shuffle() 打乱,最后用 substr() 截取指定长度:
示例代码:$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $shuffled = str_shuffle($chars); $code = substr($shuffled, 0, 6); // 取前6位 echo $code; // 如:K9mXq2
- 字符集越长,重复概率越低;6位长度下,总组合数约 62⁶ ≈ 568 亿,实际够用
- 若需避免易混淆字符(如 0/O、l/1),可手动剔除后再拼接
避免常见坑:中文、重复、安全性
str_shuffle() 不是万能验证码方案,要注意三类典型问题:
立即学习“PHP免费学习笔记(深入)”;
- 中文乱码风险:UTF-8 中文占3字节,str_shuffle 按字节操作,会破坏编码 → 改用 mb_substr + mt_rand 自定义随机抽取
- 可能生成重复验证码:函数本身不校验唯一性 → 实际业务中需配合数据库或 Redis 检查是否已存在
- 不抗预测:rand() 易被推测 → 敏感场景请改用 random_int() + 字符映射,或直接使用 sodium_crypto_randombytes()
轻量替代方案(推荐用于生产环境)
如果只是需要稳定可用的随机码,更稳妥的做法是不用 str_shuffle(),而用 PHP 7.0+ 的 random_int():
更安全的写法:$chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // 排除易混字符
$code = '';
for ($i = 0; $i < 6; $i++) {
$code .= $chars[random_int(0, strlen($chars) - 1)];
}
echo $code;- random_int() 是密码学安全的伪随机数生成器
- 字符集可自由定制,支持排除 0/O/1/l/I 等视觉相似字符
- 逻辑清晰,无多字节隐患,兼容中文环境



















