通用唯一識別碼(Universally Unique Identifier,UUID)是一項軟體建構標準,由開放軟體基金會(OSF)在分散式運算環境(DCE)中定義。其核心目的是讓分散式系統中的所有元素都能擁有唯一的辨識資訊,而無需中央控制端協調。這意味著任何人都能獨立生成不會與他人衝突的 UUID,從而避免資料庫主鍵衝突等問題。目前廣泛應用的 UUID 實現包括微軟的 GUID、Linux ext2/ext3 檔案系統、LUKS 加密分區、GNOME、KDE、Mac OS X 等。
標準 UUID 由 16 位元組(128 位)組成,理論總數為 2128(約 3.4×1038)。即便每奈秒產生 1 兆個 UUID,也需 100 億年才會用完。標準格式為 32 個十六進位數字,以連字號分為五段,形式為 8-4-4-4-12,例如:
550e8400-e29b-41d4-a716-446655440000
UUID 也可刻意重複以表示同一類別。例如在微軟 COM 中,所有元件必須實作 IUnknown 介面,其代表 UUID 固定為:00000000-0000-0000-C000-000000000046。
Java 的 java.util.UUID 生成的是版本 4(隨機生成)的 UUID,其 128 位中有 122 位為隨機位。根據生日悖論計算,碰撞機率極低:
對比之下,一個人一年被隕石擊中的機率約 6×10-11。換句話說,每秒生成 10 億個 UUID,跑 100 年才有 50% 機率碰撞一次。因此實務上幾乎無需擔心重複問題,但前提是必須使用密碼學級別的偽隨機數生成器。
Java 5 引入 java.util.UUID 類,生成 UUID 變得非常簡單。UUID 有四種基本類型:基於時間(版本 1)、DCE 安全(版本 2)、基於名稱(版本 3/5)和隨機生成(版本 4)。Java 標準庫主要提供版本 4 的隨機 UUID。
以下程式碼演示多線程環境下生成 UUID 的效能與唯一性:
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
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();
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(genReqID());
}
}
}
測試輸出顯示生成的 UUID 皆為 36 字元(含連字號),去除連字號後為 32 字元。若不需要連字號,可用 replace("-", "") 移除。多線程下生成速度極快,且無重複發生。
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
連字號位置固定,移除後不影響唯一性,且便於某些系統儲存或傳輸。
UUID 是分散式系統中極佳的唯一標識解決方案。Java 內建支援使其使用門檻極低,隨機 UUID 的碰撞機率在工程上可忽略不計。實際應用中,建議根據業務需求選擇是否保留連字號,並確保使用高品質隨機源。