自定義字符池(小寫、大寫、數字),逐位隨機選取:
<?php
function randCode(int $length): string {
$ranges = [
range('a', 'z'), // 小寫字母
range('A', 'Z'), // 大寫字母
range(0, 9) // 數字
];
$code = '';
for ($i = 0; $i < $length; $i++) {
$rkey = array_rand($ranges); // 隨機選一個字符池
$vkey = array_rand($ranges[$rkey]); // 在該池中隨機選一個字符
$code .= $ranges[$rkey][$vkey];
}
return $code;
}
echo randCode(10); // 輸出示例:3IxY8E6HOv
優點:字符集可精確控制(如排除易混淆字符 0/O, 1/l);缺點:效率稍低於 ASCII 法。
利用 ASCII 可列印字符範圍(33-126)直接生成:
<?php
function createPassword(int $length = 8): string {
$pwd = '';
for ($i = 0; $i < $length; $i++) {
$pwd .= chr(mt_rand(33, 126));
}
return $pwd;
}
echo createPassword(12); // 輸出示例:#K9!mP@2zLq$
優點:代碼極簡、執行速度快;缺點:包含特殊符號,可能不符合某些密碼策略(可調整範圍如 48-57 數字、65-90 大寫、97-122 小寫)。
將所有允許字符放入字符串,隨機索引取字符:
<?php
function generatePassword(int $length = 10, string $chars = ''): string {
$chars = $chars ?: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+[]{}|;:,.<>?';
$pwd = '';
$maxIndex = strlen($chars) - 1;
for ($i = 0; $i < $length; $i++) {
$pwd .= $chars[mt_rand(0, $maxIndex)];
}
return $pwd;
}
// 生成僅含字母數字的 16 位密碼
echo generatePassword(16, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
優點:字符集完全可控、易於擴展(如加入中文、表情符號);缺點:極長字符串時索引效率略低。
random_int()(PHP 7+)替代 mt_rand(),獲取密碼學安全的隨機數。password_hash() 加密後入庫。