UUID, GUID, ULID 是甚麼?

UUID(Universally Unique Identifier)

UUID 是一個 128 位元的唯一識別碼,用來唯一標識某一個物件或實體。它由國際標準化組織(ISO)和 IETF 定義,標準編號是 RFC 4122。

UUID 的結構與格式

  • UUID 是一個 128 位元的數字,通常以 16 進位表示,長度為 32 個字元。
  • 最基礎的 UUID 由五個部分組成,以連字號 - 分隔,例如 550e8400-e29b-41d4-a716-446655440000。
    • 前 8 位:時間戳的一部份
    • 中 4 位:時間戳的另一部份
    • M 位:版本號,用來表明 UUID 的版本與生成方式
    • N 位:變體號,用來標識 UUID 標準的實現
    • 後 12 位:可能包含時間戳、MAC 地址、隨機數等
  • 但是,UUID 有多種版本,不同版本的 UUID 有不同的結構和生成方式,前一點是指 UUIDv1。

UUIDv1

  • 基於時間戳和 MAC 地址
  • MAC 地址的暴露可能導致隱私泄露

UUIDv2

  • 是基於 v1 的 UUID,但是將時間戳的一部分替換為 POSIX 的 UID 或 GID
  • 不常用

UUIDv3

  • 基於名稱和名稱空間(namespace)的 MD5 雜湊值

UUIDv4

  • 大部分都是基於隨機數生成的
  • 這是最常使用的 UUID 版本
  • 碰撞率極低,約為 1/2^122

UUIDv5

  • 與 v3 類似,但是使用 SHA-1 雜湊值

GUID(Globally Unique Identifier)

GUID 是微軟實現的 UUID,二者在結構和使用上幾乎相同,可以視為 UUID 的一個實作版本。

ULID(Universally Unique Lexicographically Sortable Identifier)

ULID 是一種新型的唯一識別碼,由 Crockford 提出,它結合了 UUID 和時間戳,具有以下特點:

  • 128 位元,比 UUID 短
  • 與 UUID 一樣具有唯一性
  • 採用字典序,方便字母數字排序(Lexicographically Sortable)
  • 可讀性高,比 UUID 更易於使用和分享。
  • 可以用於分散式系統中,避免 ID 的碰撞
  • 可以用於 URL,不需要編碼
  • ULID 是為了解決 UUID 在排序和易讀性上的缺點而設計的,特別適用於需要排序的分散式系統和高並發場景。

ULID 的結構與格式

  • ULID 是 128 位元的數字,通常以 16 進位表示,長度為 26 個字元。
  • ULID 由兩部分組成,,形如 01H9WJZ4RT6P7V0D8QFZ2MNXCJ。
    • 前 10 個字元:48 位元數的時間戳,是基於 Unix 時間戳
    • 後 16 個字元:80 位元的隨機數

UUID 與 ULID 的比較

特性 UUID v4 ULID 長度 36 字元(含連字符) 26 字元 排序性 不支持 支援基於時間排序 唯一性 極低碰撞概率 極低碰撞概率 可讀性 較差(含隨機字元和連字符) 更簡潔,適合人類閱讀 時間信息 不包含 包含時間戳

特性 UUID v4 ULID
長度 36 字元(含連字符) 26 字元
排序性 不支持 支援基於時間排序
唯一性 極低碰撞概率 極低碰撞概率
可讀性 較差(含隨機字元和連字符) 更簡潔,適合人類閱讀
時間信息 不包含 包含時間戳

UUIDv1 和 UUIDv2 包含時間戳,但 UUIDv3、UUIDv4 和 UUIDv5 不包含時間戳。