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

PHP 生成唯一 ID 的 3 種實用方案:從簡單到高可用

     編輯:PHP 綜合知識

專案開發中常需生成唯一 ID(如訂單號、Token、分散式追蹤 ID)。本文整理三種不同層級的 PHP 唯一 ID 生成方案,按可靠度遞增排序。

方案一:時間戳 + 隨機數 + MD5(簡易版)

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

⚠️ 缺點:極高併發下仍有極低機率碰撞,不適合強一致性場景。

方案二:PHP 內建 uniqid() + 自定義格式化(進階版)

uniqid() 基於微秒時間生成 ID,但官方文檔提醒:「基於系統時間,生成的 ID 不是最佳的。如需絕對唯一,請配合 md5() 使用。」

function uuid() {
    if (function_exists('com_create_guid')) {
        return com_create_guid(); // Windows COM 元件(PHP 5.3+ 已棄用)
    }
    mt_srand((double)microtime() * 10000); // PHP 4.2.0+ 可省略
    $charid = strtoupper(md5(uniqid(rand(), true)));
    $hyphen = chr(45); // '-'
    return  substr($charid, 0, 8) . $hyphen
          . substr($charid, 8, 4) . $hyphen
          . substr($charid, 12, 4) . $hyphen
          . substr($charid, 16, 4) . $hyphen
          . substr($charid, 20, 12);
}

輸出格式類似:5DDB650F-4389-F4A9-A100-501EF1348872

方案三:多熵源雜湊(高可用版)

結合請求上下文(User-Agent、IP、Port、時間等)與 ripemd128 雜湊,碰撞概率極低:

public function create_guid($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;
}

輸出類似:{E2DFFFB3-571E-6CFC-4B5C-9FEDAAF2EFD7}

選型建議

場景推薦方案理由
一般業務流水號、臨時 Token方案一代碼最少,效能最好
分散式系統、跨服務追蹤 ID方案二或三格式標準化,碰撞率極低
高安全性、審計追溯方案三多熵源,抗偽造與碰撞

💡 現代專案建議:若使用 Composer,直接引入 ramsey/uuid(RFC 4122 標準實作),支援 UUID v1~v7,開箱即用、零風險。

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