在 PHP 開發中,生成唯一識別碼是常見需求,無論是用於資料庫主鍵、Session ID、訂單號還是 API Token。本文將系統梳理 PHP 內建函數與自定義演算法,幫助你選擇最適合業務場景的方案。
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)
}
?>
若需符合 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 具備「空間與時間雙重唯一」特性,適合分散式系統、資料庫合併、離線優先應用等場景。
uniqid('', true) 即可,字串短、可排序。md5(uniqid(mt_rand(), true)) 或 sha1() 版本。random_bytes(16) 組裝(PHP 7+)。UUID() 或 ULID,避免應用層產生衝突。<?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));
}
?>
此寫法不依賴時間戳,抗衝突能力最強,且無需額外擴充套件。