在現代軟體開發中,唯一識別碼(Unique Identifier)是構成系統基礎的重要元件。無論是資料庫主鍵、API 資源識別、使用者 ID、訂單編號還是檔案名稱,我們都需要一個可靠的機制來產生不重複的標識。
UUID:最廣泛使用的標準
UUID(Universally Unique Identifier)是一組 128 位元的識別碼標準(RFC 4122),其設計目標是在不需要中央協調機制的條件下,保證全球範圍的唯一性。最常見的 UUID v4 完全依賴亂數產生,而較新的 UUID v7 則結合了時間戳與亂數,提供時間有序的特性。
UUID 的優勢在於其標準化程度最高,幾乎所有程式語言和資料庫都有原生支援,非常適合跨系統、跨語言的應用場景。然而其 36 字元的長度在某些場合顯得冗長,且 v4 的純隨機特性對資料庫索引不夠友善。
ULID:可排序的現代替代方案
ULID(Universally Unique Lexicographically Sortable Identifier)由 Alizain Feerasta 於 2016 年提出,旨在解決 UUID 不可排序的問題。ULID 同樣為 128 位元,但編碼為 26 字元的 Crockford Base32 字串。其時間戳前綴確保了字典序排序即為時間序排序,且在同一毫秒內可產生多達 2^80 個唯一值。
Crockford Base32 編碼的額外好處是排除了容易混淆的字元(如 I、L、O、U),提高了人類閱讀與手動輸入的正確性。ULID 的大小寫不敏感特性也使其在 URL 中使用時更友善。
Nano ID:輕量級高效方案
Nano ID 由 Andrey Sitnik(也是 PostCSS 與 Autoprefixer 的作者)開發,是目前前端生態中最受歡迎的 ID 產生器之一。與 UUID 和 ULID 不同,Nano ID 不是固定格式的標準,而是一個可自訂的實作方案。其核心設計哲學是「在最小的體積下提供足夠的唯一性」。
Nano ID 使用 64 字元的 URL 安全字母表(包含 A-Z、a-z、0-9、- 和 _),預設長度 21 字元下可提供與 UUID v4 相同的 126 bits 亂度。透過調整長度參數,可在安全性與簡潔性之間靈活切換。
CUID2:水平擴展的防碰撞方案
CUID2 是 CUID 的第二代版本,由 Eric Elliott 建立,特別針對水平擴展(Horizontal Scaling)場景設計。CUID2 內部使用遞增計數器、亂數指紋以及雜湊函數,確保在分散式系統中即使沒有中央協調器也不會產生碰撞。
CUID2 的預設長度約為 24 字元,包含了編碼的指紋資訊,因此即使兩台伺服器在同一毫秒內產生 ID,結果也截然不同。這使得 CUID2 成為微服務架構與 Serverless 應用的理想選擇。
如何選擇?實務建議
如果你是建立新的 PostgreSQL 或 MySQL 資料表,並希望使用 UUID 作為主鍵,強烈建議選擇 UUID v7,它能大幅減少索引碎片化問題。如果你需要對外暴露 ID 且希望長度較短,ULID 或 Nano ID 是更好的選擇。對於安全性要求極高的水平擴展場景,CUID2 提供了額外的防碰撞保障。
無論你選擇哪種格式,都可以使用 ToolHub 的 ID 產生器快速生成測試資料,並透過碰撞機率計算器驗證你的選擇是否滿足業務需求。