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

PHP 產生唯一 ID 的多種方法與效能比較

     編輯:PHP 綜合知識

PHP 產生唯一識別碼(UID)方案總覽

根據應用場景(訂單號、Session ID、分散式系統節點 ID)選擇適當方法。以下整理常見方案優缺點。

方法一:md5 + time + 隨機數(簡單但有極低撞擊機率)

$id = md5(time() . mt_rand(1, 1000000));

長度 32 字元,單機低併發可用,高併發或分散式不推薦。

方法二:uniqid() 內建函數(微秒級時間)

$id = uniqid();           // 如 5f8d3a1b2c4e6
$id = uniqid('prefix_');  // 加前綴
$id = uniqid('', true);   // more_entropy=true,增加熵值

基於微秒時間,同一微秒內多次呼叫可能重複,官方文件建議搭配 md5() 使用。

方法三:UUID v4 標準格式(通用、跨語言)

function generateUuid() {
    // Windows 有 com_create_guid,Linux 需自行實作
    if (function_exists('com_create_guid')) {
        return com_create_guid(); // 含大括號 {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
    }
    // 手動實作 RFC 4122 v4
    $bytes = random_bytes(16);
    // 設定版本位元 (4) 與變體位元 (10xx)
    $bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40);
    $bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80);
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
}
// 輸出範例:5d2f8a1c-3b7e-4f9a-8c2d-1e6f9a3b7c4d

方法四:結合伺服器資訊的高熵 ID(類似原文提供)

function createGuid($namespace = '') {
    static $guid = '';
    $uid = uniqid('', true);
    $data = $namespace
        . $_SERVER['REQUEST_TIME']
        . ($_SERVER['HTTP_USER_AGENT'] ?? '')
        . ($_SERVER['LOCAL_ADDR'] ?? '')
        . ($_SERVER['LOCAL_PORT'] ?? '')
        . ($_SERVER['REMOTE_ADDR'] ?? '')
        . ($_SERVER['REMOTE_PORT'] ?? '');
    $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
    $guid = '{' 
        . substr($hash, 0, 8) . '-'
        . substr($hash, 8, 4) . '-'
        . substr($hash, 12, 4) . '-'
        . substr($hash, 16, 4) . '-'
        . substr($hash, 20, 12)
        . '}';
    return $guid;
}

方法五:資料庫自增 ID / Snowflake 演算法(分散式系統)

  • 單一資料庫:AUTO_INCREMENT 或 SEQUENCE 最簡單可靠。
  • 分散式:Twitter Snowflake(41bit 時間 + 10bit 機器 + 12bit 序列)或其 PHP 實作 snowflake-php。
  • UUID v1(時間+MAC)或 v7(時間+隨機)也適合分散式排序需求。

選擇建議表

場景推薦方法長度排序性
一般 Web 表單 Tokenuniqid('', true) / bin2hex(random_bytes(16))32無
API 請求追蹤 IDUUID v436無
訂單號、流水號日期前綴 + 自增/隨機自訂可排序
分散式服務追蹤Snowflake / UUID v764bit/36可排序
資料庫主鍵BIGINT AUTO_INCREMENT / UUID--

核心原則:業務可讀性用有意義前綴,高併發用隨機熵,需排序用時間元件,分散式用協調演算法。

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