在 Java 等後端語言中,常用 UUID 生成 32 位唯一標識。前端 JavaScript 原生 Math.random() 僅返回 0~1 之間的浮點數,精度有限,直接拼接易產生重複,且不包含 0 和 1 本身(左閉右開區間 [0, 1))。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
Date.now() 時間戳 | 極簡單、基本不重複 | 可預測、同毫秒內並發會衝突 | 臨時 ID、日誌標記 |
Math.random() 拼接 | 無依賴 | 碰撞概率較高、非加密安全 | 非關鍵業務隨機數 |
crypto.getRandomValues() | 加密級隨機、低碰撞 | 舊瀏覽器不支援(IE11+ 支援) | 生產環境 UUID、Token |
| UUID 庫 | 符合 RFC4122、功能豐富 | 增加體積 | 複雜項目 |
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = crypto.getRandomValues(new Uint8Array(1))[0] % 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
對於「位數比較多且不重複」的需求,優先使用 crypto.getRandomValues() 實現 UUID v4;若環境受限,時間戳 + 隨機數混合作為折衷方案。