uniqid() 基於微秒時間生成,高併發 (同一微秒內多請求) 極易產生重複 ID。
| 方案 | 代碼 | 重複機率 | 備註 |
|---|---|---|---|
| 基礎 | uniqid() | 高 (微秒級衝突) | 不推薦生產環境 |
| 加隨機前綴 | uniqid(rand(1000,9999)) | 中 (前綴增加熵) | 仍依賴時間 |
| MD5 雜湊 | md5(uniqid(rand(), true)) | 極低 (128-bit 空間) | ✅ 推薦 |
| 更強:random_bytes | bin2hex(random_bytes(16)) | 密碼學安全 | PHP 7+ 首選 |
| UUID v4 | ramsey/uuid 或自實作 RFC4122 | 標準化、無衝突 | 分散式系統首選 |
<?php
// 方案 1:md5 + uniqid + more_entropy
function generateToken1() {
return md5(uniqid(rand(), true)); // true 開啟 more_entropy
}
// 方案 2:random_bytes (PHP 7+)
function generateToken2() {
return bin2hex(random_bytes(16)); // 32 字元十六進制
}
// 方案 3:簡易 UUID v4
function generateUuid() {
$bytes = random_bytes(16);
$bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40); // version 4
$bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80); // variant 10
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
}
md5(uniqid(rand(), true)) 足夠。random_bytes 或 UUID v4。不要裸用 uniqid()。最少加 rand() 前綴並 md5() 雜湊;PHP 7+ 專案直接用 random_bytes() 獲得密碼學級隨機性;分散式場景採用標準 UUID/ULID/Snowflake。選對工具,杜絕重複風險。