在訂單編號、驗證碼、短網址代碼等場景,常需要純數字的固定長度隨機字串。本文介紹兩種產生 16 位數字隨機碼的 PHP 方法,分析其原理、效能與適用場景。
<?php $a = mt_rand(10000000, 99999999); // 8 位 $b = mt_rand(10000000, 99999999); // 8 位 echo $a . $b; // 16 位純數字
mt_rand() 為梅森旋轉演算法,速度快、隨機品質佳;兩次產生 8 位數字拼接成 16 位sprintf('%08d%08d', mt_rand(0, 99999999), mt_rand(0, 99999999)) 可保證 16 位含前導零<?php
$a = range(0, 9); // [0,1,2,3,4,5,6,7,8,9]
$b = [];
for ($i = 0; $i < 16; $i++) {
$b[] = array_rand($a); // 從 0~9 隨機取一個鍵名(即數字本身)
}
echo join('', $b); // 如 "0179571910024734"
array_rand() 從陣列隨機取一或多個鍵名;此處陣列鍵名即 0~9,故直接取得隨機數字array_rand(),效能遠低於方法一;array_rand() 內部需打亂陣列,開銷大// 100 萬次執行時間概估 方法一:~0.15 秒 方法二:~1.8 秒 (慢約 12 倍)
function generateRandomString(int $length = 16, string $charset = '0123456789'): string {
$bytes = random_bytes($length); // PHP 7+ 加密安全隨機位元組
$mask = strlen($charset) - 1;
$result = '';
for ($i = 0; $i < $length; $i++) {
$result .= $charset[$bytes[$i] & $mask]; // 位元遮罩映射
}
return $result;
}
// 使用範例
echo generateRandomString(16); // 16 位純數字
echo generateRandomString(16, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'); // 含大寫字母
random_bytes() 具加密安全性、單次取得足夠隨機位元組、位元運算極快、支援任意字元集與長度| 函式 | 隨機來源 | 適用場景 |
|---|---|---|
rand() |
舊式線性同餘,可預測 | 不建議使用 |
mt_rand() |
梅森旋轉,統計隨機性好 | 一般業務邏輯、非安全關鍵 |
random_int() / random_bytes() |
作業系統 CSPRNG | Token、密碼、加密金鑰等安全敏感場景 |
純數字 16 位隨機碼,推薦方法一 mt_rand() 雙段拼接,效能最佳、程式碼最簡潔。若需前導零,用 sprintf('%016d', mt_rand(0, 9999999999999999)) 或 str_pad() 補齊。涉及安全敏感場景(API Token、重設密碼碼),務必改用 random_bytes() 或 random_int()。方法二 array_rand() 迴圈僅適合教學或特殊字元集取樣,生產環境不建議使用。