# 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 不包含時間戳。