首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 產生 16 位隨機數字的兩種實用方法與效能比較

     編輯:PHP 相關知識

需求背景

在訂單編號、驗證碼、短網址代碼等場景,常需要純數字的固定長度隨機字串。本文介紹兩種產生 16 位數字隨機碼的 PHP 方法,分析其原理、效能與適用場景。

方法一:雙段 mt_rand() 拼接(高效、推薦)

<?php
$a = mt_rand(10000000, 99999999); // 8 位
$b = mt_rand(10000000, 99999999); // 8 位
echo $a . $b; // 16 位純數字
  • 原理:mt_rand() 為梅森旋轉演算法,速度快、隨機品質佳;兩次產生 8 位數字拼接成 16 位
  • 優點:極快、程式碼極簡、無迴圈開銷
  • 缺點:首位不為 0(範圍 10000000~99999999),若需允許前導零需調整
  • 變體:sprintf('%08d%08d', mt_rand(0, 99999999), mt_rand(0, 99999999)) 可保證 16 位含前導零

方法二:range() + array_rand() 迴圈(教學示範、效能較低)

<?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,故直接取得隨機數字
  • 缺點:迴圈 16 次呼叫 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() 具加密安全性、單次取得足夠隨機位元組、位元運算極快、支援任意字元集與長度
  • 適用:Token、API Key、CSRF Token、重設密碼連結等需高熵值場景

安全性提醒

函式隨機來源適用場景
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() 迴圈僅適合教學或特殊字元集取樣,生產環境不建議使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved