java.util.UUID 是分散式系統生成全域唯一識別碼的標準工具。本文從原理、碰撞機率、Java 5+ 實作到多執行緒併發測試,全方位解析 UUID 使用要點。
UUID 基礎知識
- 結構:128 位(16 位元組),標準格式 32 位十六進制字符,分 5 段
8-4-4-4-12(如 550e8400-e29b-41d4-a716-446655440000)
- 版本:v1 時間基礎、v2 DCE 安全、v3/v5 名稱基礎(MD5/SHA-1)、v4 隨機生成(Java
UUID.randomUUID() 使用此版本)
- 隨機位:v4 佔 122 位隨機位,4 位版本號,2 位變體位
碰撞機率數學分析
依據生日悖論,n 個 UUID 產生碰撞機率約為 n² / 2¹²³:
| 生成量 | 機率 |
| 2³⁶ (687 億) | 4×10⁻¹⁶ |
| 2⁴¹ (2.2 兆) | 4×10⁻¹³ |
| 2⁴⁶ (70 兆) | 4×10⁻¹⁰ |
對比:每年被隕石擊中機率約 6×10⁻¹¹。每秒生成 10 億 UUID,跑 100 年碰撞機率才 50%。工程上可忽略碰撞風險,前提是使用密碼學級隨機數生成器(Java `SecureRandom` 底層保證)。
Java 實作與併發測試
public class TestUUID implements Runnable {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 8; i++) pool.execute(new TestUUID());
pool.shutdown();
}
public static String genReqID() {
return UUID.randomUUID().toString().toUpperCase(); // 或 .replace("-", "") 去除連字符
}
public void run() {
for (int i = 0; i < 10; i++) System.out.println(genReqID());
}
}
測試 8 執行緒 × 10 次 = 80 個 UUID,全數唯一,格式固定 36 字符(含連字符)或 32 字符(去除連字符)。連字符位置固定,移除後不影響唯一性,便於儲存與索引。
實戰建議
- 預設用 `UUID.randomUUID()`:執行緒安全、效能優異、碰撞風險可忽略
- 需短 ID 時移除連字符:
.replace("-", "").toUpperCase() 得到 32 字符大寫字串
- 高併發場景無需加鎖:`SecureRandom` 內部已處理併發
- 避免自行實作:時間基礎 UUID 需解決時鐘回撥、節點 ID 分配等複雜問題
- 上一篇文章: Java EE 應用實現資料庫端用戶審計:JDBC 4.0 與廠商擴展 API 實戰指南
- 下一篇文章: EMF 元建模實戰:擴展 Ecore 定義程式行為,動態 JET 模板生成可重用 Java 代碼片段
Copyright ©
程式碼之家 All Rights Reserved