ulid 是什麼
ulid(通用唯一按字典排序的識別符)是一種新型的全域唯一識別符,它結合了時間戳與隨機數的特性,提供高效能、低碰撞,並且可排序的識別符。
ulid 特點
- 全域唯一性:透過時間戳與隨機數,確保產生的
ulid
在全球都是唯一的。 - 時序性:
ulid
中的時間戳部分精確到毫秒,可以得知ulid
的產生時間,因此能方便對實體進行排序與檢索。 - 高效能:
ulid
生成速度遠快於uuid
的生成速度。 - 相容性:
ulid
與uuid
一樣都是 128 位,可以與現有的uuid
標準相容。
ulid 主要應用場景
- 分散式系統:在分散式系統中,可以用
ulid
作為實體唯一識別符,保障不同節點上產生的 id 是唯一的。 - 資料庫索引:在資料庫中使用
ulid
作為主鍵,可以避免主鍵衝突問題,並且能進行排序,提供較好的檢索效能。 - 日誌紀錄:在日誌系統中可用
ulid
作為唯一 id,確保不同機器產生的 id 是唯一的,同時也能方便地對日誌進行排序與檢索。
ulid 組成
時間戳
48bit
的整數。Unix 時間戳
(毫秒)。
隨機數
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+