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

PHP 生成唯一識別碼的多種方法與最佳實踐

     編輯:PHP 綜合知識

在 PHP 開發中,生成唯一識別碼是常見需求,無論是用於資料庫主鍵、Session ID、訂單號還是 API Token。本文將系統梳理 PHP 內建函數與自定義演算法,幫助你選擇最適合業務場景的方案。

核心內建函數:uniqid()

PHP 提供了 uniqid() 函數,基於當前時間(微秒)生成唯一 ID。基本用法如下:

<?php
echo uniqid();           // 13 位字串,如 65f1a2b3c4d5e
echo uniqid('php_');     // 加前綴:php_65f1a2b3c4d5e
echo uniqid('php_', true); // 開啟 more_entropy,產生 23 位字串
?>

注意:高併發下 uniqid() 仍有極低重複概率,生產環境建議搭配雜湊函數強化。

進階方案:結合雜湊演算法

常見做法是將 uniqid() 或時間戳配合 md5()、sha1() 產生定長、分布更均勻的識別碼:

<?php
// 方案一:uniqid + md5
echo md5(uniqid());

// 方案二:時間戳 + 隨機數
echo md5(time() . mt_rand(1, 1000000));

// 方案三:加入客戶端資訊(IP、User-Agent)增強唯一性
function create_unique() {
    $data = $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'] . time() . rand();
    return sha1($data); // 或 md5($data)
}
?>

產生標準 GUID (UUID)

若需符合 RFC 4122 規範的全域唯一識別碼(32 位十六進位 + 4 個連字號),可使用下列函數:

<?php
function getGuid() {
    $charid = strtoupper(md5(uniqid(mt_rand(), true)));
    $hyphen = '-';
    $uuid = substr($charid, 0, 8) . $hyphen
          . substr($charid, 8, 4) . $hyphen
          . substr($charid, 12, 4) . $hyphen
          . substr($charid, 16, 4) . $hyphen
          . substr($charid, 20, 12);
    return $uuid;
}
echo getGuid(); // 輸出範例:A1B2C3D4-E5F6-7890-ABCD-EF1234567890
?>

GUID 具備「空間與時間雙重唯一」特性,適合分散式系統、資料庫合併、離線優先應用等場景。

效能與選型建議

  • 短 ID、低併發:uniqid('', true) 即可,字串短、可排序。
  • 高併發、需固定長度:md5(uniqid(mt_rand(), true)) 或 sha1() 版本。
  • 跨系統、離線生成:採用標準 GUID/UUID(v4 隨機版),可直接用 random_bytes(16) 組裝(PHP 7+)。
  • 資料庫主鍵:優先考慮資料庫原生 UUID() 或 ULID,避免應用層產生衝突。

現代 PHP (7.0+) 推薦寫法

<?php
// 使用隨機位元組產生 RFC 4122 v4 UUID
function uuid_v4() {
    $data = random_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // version 4
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // variant 10
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
?>

此寫法不依賴時間戳,抗衝突能力最強,且無需額外擴充套件。

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