guest@blog.cmj.tw: ~/posts $

ULID


Srotable UUID

因為上班同事看到 ULID 就把資料整理一下

Format

ULID 是一個 128-bit 的 UUID 格式,號稱毫秒 (millisecond) 內可以有 1.21e+24 為一個 ULID 可以產生, 當然重點是它可以排序 (sortable)。原則上來說內容是不分大小寫且沒有特殊字元:代表可以使用在 URL 上面 (URL-safe)。 結構上來說,前面 48-bits 是 timestamp 內容而後面 80-bits 則是一個隨機數 (Randomness)。

Timetsamp

結構上使用 UNIX-格式的 timestamp (用 millisecond 表示),這代表在 AD 10889 之前都不會產生溢位 (Overflow)

Randomness

一個 80-bits 的隨機數字,如果可能使用密碼學方式驗證他的隨機性

Monotonicity

因為是 sortable 的 UUID,因此在隨機數的部分需要保證為單調性 (monotonicity),這也表示接續產生隨機數需要嚴格遞增, 因此在同一毫秒內最大的 ULID 的隨機數部分一定是 ZZZZZZZZZZZZZZZZ

Python

在 Python 上面則有三種版本 mdomke ahawker mdipierro : mdipierro 提供的版本最為精簡,僅有 55 行 Python Code: 三個實作都使用到類似的實作邏輯產生一組 ULID。Timestamp 透過 time 或者 datetime 來產生,而 Randomness 這個欄位則透過 urandom 產生。 可以看到在Randomness 這個欄位上來說,這些版本具有隨機性但不具有單調性。