好文分享 — 8 種版本 UUID 的簡介與何時使用它們 / TIL: 8 versions of UUID and when to use them
根據 RFC 9562 文件定義,有 10 種 UUIDs,其中 2 種為 Nil 與 Max UUID,分別為 00000000-0000-0000-0000-000000000000
與 FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
這 2 種,剩下 8 種就是 UUID version 1 到 UUID version 8 。
UUID version 1 到 UUID version 8 有不同的生成與排列方式,也因為如此,它們各自有適合的應用場景。
簡單來說,如果需要隨機的 UUID 的話,可以選擇 UUID v4 就好。
但 UUID v4 的生成是無序的特點,不適合作為資料庫的索引欄位使用,這時可以使用 UUID v7 取代 UUID v4 ,原因是 UUID v7 前面 48-bit 使用 Unix Epoch timestamp,所以 UUID v7 前 48-bit 可以用來排序,可以說 UUID v7 用部分有序減少 UUID v4 對資料庫效能的影響。
UUID v5 與 v8 則適合需要用自己提供的資料生成 ID 的情況。
UUID v5 其實是用我們傳入的 namespace 與 name 接在一起之後,算出其 SHA1 雜湊值之後,再生成 UUID v5;而 UUID v8 除了 version 與 variant 2 個欄位有規範之外,剩下的 bits 都可以自行決定要放什麼資料,屬於高度可客製化的 UUID 版本,而 RFC 9562 也指出 UUID v8 是給實驗使用或者讓 vendor 客製的格式,所以一般開發者不會特意使用 UUID v8,這也是你不會在函式庫中看到 UUID v8 的原因。
總結一下:
- UUID v4 無序隨機
- UUID v7 前 48-bit 有序
- UUID v5 利用帶入資料的 SHA1 雜湊值生成 UUID
至於剩下的 UUID 則基本上可以忽略,不是被 v7 或者 v5 改善/取代,就是屬於特別保留的 UUID (例如 UUID v2)。
有興趣的話,可以閱讀 “TIL: 8 versions of UUID and when to use them” 1 文。