UUID 的演進:深入理解版本 1、6 與 7
通用唯一識別碼(UUID)數十年來一直是分散式系統的基石,提供了一種無需中央協調即可產生唯一鍵的可靠方式。雖然依賴純隨機數的 UUID 版本 4 是最知名且應用最廣的變體,但當用作關聯式資料庫管理系統(RDBMS)的主鍵時,它存在固有局限性。隨機性對於不可預測性非常優秀,但對於資料庫索引卻極其糟糕。將隨機 UUID 插入 B-Tree 索引會導致大量的頁分割與索引碎片,隨著時間的推移降低寫入效能。這就是基於時間的 UUID(特別是版本 1、6 與 7)發揮作用的地方,它們提供了一種兼顧唯一性與時間順序的結構化替代方案。
UUID 版本 1 是將唯一性與時間結合的首次嘗試。它使用當前時間戳記、時鐘序列和節點的 MAC 位址來產生識別碼。包含 MAC 位址保證了不同機器之間的空間唯一性,而時間戳記則保證了時間唯一性。然而,UUID v1 在資料庫索引方面存在致命缺陷:其時間戳記的結構使得有效位元代表最低的時間粒度。簡單來說,隨著時間的推移,UUID 字串的開頭變化迅速且不可預測,破壞了順序排序的可能性。此外,暴露 MAC 位址引發了嚴重的隱私與安全擔憂,導致許多開發者徹底放棄了 v1。
為了解決這些顯著問題,工程界引入了 UUID 版本 6 與版本 7。UUID v6 本質上是重構後的 UUID v1。它重新排列了 v1 的時間戳記組件,使最高有效位元代表最高的時間粒度(年、月、日),一直向下延伸到亞秒級。這種簡單的重排確保了 UUID v6 值可以按時間進行字典序排序。如果您今天產生一個 v6 UUID,明天產生另一個,明天的 UUID 將排在今天的後面,這與資料庫 B-Tree 期望的資料插入方式完全吻合。這消除了與 v4 相關的索引碎片以及 v1 無法排序的問題,同時保持與傳統 UUID 結構的相容性。
UUID 版本 7 將這種最佳化提升到了一個新的高度,代表了現代資料庫主鍵的金牌標準。UUID v7 放棄了 v1 與 v6 使用的舊版儒略/格里高利曆法紀元,轉而採用標準的 Unix 紀元時間戳記(自 1970 年 1 月 1 日 UTC 午夜以來的毫秒數)。該時間戳記佔用識別碼的前 48 位元。其餘位元填充有強密碼學隨機資料。這種混合方法結合了高性能資料庫插入所需的順序排序能力與隨機資料產生的安全性及隱私性。透過使用我們 100% 免費、私密的瀏覽器端 UUID 產生器,您可以即時建立這些現代識別碼,且零伺服器上傳。