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 這個欄位上來說,這些版本具有隨機性但不具有單調性。