ulid 是什麼

ulid(通用唯一按字典排序的識別符)是一種新型的全域唯一識別符,它結合了時間戳與隨機數的特性,提供高效能、低碰撞,並且可排序的識別符。

ulid 特點

  1. 全域唯一性:透過時間戳與隨機數,確保產生的 ulid 在全球都是唯一的。
  2. 時序性ulid 中的時間戳部分精確到毫秒,可以得知 ulid 的產生時間,因此能方便對實體進行排序與檢索。
  3. 高效能ulid 生成速度遠快於 uuid 的生成速度。
  4. 相容性uliduuid 一樣都是 128 位,可以與現有的 uuid 標準相容。

ulid 主要應用場景

  • 分散式系統:在分散式系統中,可以用 ulid 作為實體唯一識別符,保障不同節點上產生的 id 是唯一的。
  • 資料庫索引:在資料庫中使用 ulid 作為主鍵,可以避免主鍵衝突問題,並且能進行排序,提供較好的檢索效能。
  • 日誌紀錄:在日誌系統中可用 ulid 作為唯一 id,確保不同機器產生的 id 是唯一的,同時也能方便地對日誌進行排序與檢索。

ulid 組成

時間戳

  1. 48bit 的整數。
  2. Unix 時間戳(毫秒)。

隨機數

  1. 80bit 的隨機數。

排序

最左邊的字元必須排在最左,最右邊的字元必須排在最右,且必須使用 ASCII 字元集

編碼方式

透過 Crockford 的 Base32 進行編碼,該編碼方式字母表不包括 I、L、O、U。

二進位佈局與位元組順序

元件會被編碼為 16 個位元組(octet)。每個元件皆以最高有效位元組在前(網路位元組順序)進行編碼。

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      32_bit_uint_time_high                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     16_bit_uint_time_low      |       16_bit_uint_random      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+