
連結:https://blog.csdn.net/pushiqiang/article/details/117365290

UUID:Universally Unique Lexicographically Sortable Identifier(通用唯一詞典分類識別符號)
UUID :Universally Unique Identifier(通用唯一識別符號)
為什麼不選擇UUID
UUID 目前有 5 個版本:
-
版本1:在許多環境中是不切實際的,因為它需要訪問唯一的,穩定的MAC地址,容易被攻擊; -
版本2:將版本 1 的時間戳前四位換為 POSIX 的 UID 或 GID,問題同上; -
版本3:基於 MD5 雜湊演算法生成,生成隨機分佈的ID需要唯一的種子,這可能導致許多資料結構碎片化; -
版本4:基於隨機數或偽隨機數生成,除了隨機性外沒有提供其他資訊; -
版本5:透過 SHA-1 雜湊演算法生成,生成隨機分佈的ID需要唯一的種子,這可能導致許多資料結構碎片化;
這裡面常用的就是 UUID4 了,但是,即使是隨機的,但是也是存在衝突的風險。
和 UUID 要麼基於隨機數,要麼基於時間戳不同,ULID 是既基於時間戳又基於隨機數,時間戳精確到毫秒,毫秒內有1.21e + 24個隨機數,不存在衝突的風險,而且轉換成字串比 UUID 更加友好。
ULID特性
-
與UUID的128位相容性 -
每毫秒1.21e + 24個唯一ULID -
按字典順序(也就是字母順序)排序! -
規範地編碼為26個字串,而不是UUID的36個字元 -
使用Crockford的base32獲得更好的效率和可讀性(每個字元5位) -
不區分大小寫 -
沒有特殊字元(URL安全) -
單調排序順序(正確檢測並處理相同的毫秒)
ULID規範
以下是在python(ulid-py)中實現的ULID的當前規範。二進位制格式已實現
組成
時間戳
-
48位整數 -
UNIX時間(以毫秒為單位) -
直到公元10889年,空間都不會耗盡。
隨機性
-
80位隨機數 -
如果可能的話,採用加密技術保證隨機性
排序
最左邊的字元必須排在最前面,最右邊的字元必須排在最後(詞彙順序)。必須使用預設的ASCII字元集。在同一毫秒內,不能保證排序順序。
編碼方式
如圖所示,使用了Crockford的Base32。該字母表不包括字母I,L,O和U,以避免混淆和濫用。
二進位制佈局和位元組順序
元件被編碼為16個八位位組。每個元件都以最高有效位元組在前(網路位元組順序)進行編碼。
應用場景
-
替換資料庫自增id,無需DB參與主鍵生成 -
分散式環境下,替換UUID,全域性唯一且毫秒精度有序 -
比如要按日期對資料庫進行分割槽分表,可以使用ULID中嵌入的時間戳來選擇正確的分割槽分表 -
如果毫秒精度是可以接受的(毫秒內無序),可以按照ULID排序,而不是單獨的created_at欄位
用法(python)
安裝
建立一個全新的ULID。
時間戳記值(48位)來自
time.time()
,精度為毫秒。隨機值(80位)來自
os.urandom()
。根據現有的128位值(例如UUID)建立新的ULID 。支援ULID值型別有 int,bytes,str,和UUID。
從現有時間戳值(例如
datetime
物件)建立新的ULID 。支援時間戳值型別有int,float,str,bytes,bytearray,memoryview,datetime,Timestamp,和ULID。
根據現有的隨機數建立一個新的ULID。
支援隨機值型別有int,float,str,bytes,bytearray,memoryview,Randomness,和ULID。
一旦有了ULID物件,就有多種與之互動的方法。
timestamp()
方法將為您提供ULID的前48位的時間戳快照,而randomness()
方法將為您提供後80位的隨機數快照。-
github:https://github.com/ahawker/ulid

想要學習Linux系統的讀者可以點選"閱讀原文"按鈕來了解書籍《Linux就該這麼學》,同時也非常適合專業的運維人員閱讀,成為輔助您工作的高價值工具書!