ULID 產生器

線上產生 ULID:26 字元 Crockford Base32,包含 48 位元時間和 80 個隨機位元。

格式
產生結果
就緒,可在瀏覽器裡產生 ULID。

這個 ID 的結構

結構
26 個 Crockford Base32 字元:前 10 個是時間,後 16 個是隨機部分。
48 位元毫秒時間戳之後,還有 80 個隨機位元。
時間
包含。前 10 個字元編碼毫秒時間,字典序會跟隨時間。
碰撞風險
隨機尾部有 80 位元;風險主要取決於同一毫秒內產生多少個 ID。
範例
01M12BRP00BFWK609TBXCXC61C

你的 ID 會用瀏覽器裡的強隨機來源在本地產生,不會傳送到 BroBroGo。

常見問題

ULID 適合什麼場景?

ULID 緊湊、URL 友好,純文字也能按時間排序,適合日誌、物件鍵和需要按建立時間排列的記錄。

ULID 和 UUID v7 一樣嗎?

不一樣。兩者都有毫秒時間,但 ULID 是 26 字元 Crockford Base32,UUID v7 保留標準 UUID 十六進位形態。

ULID 產生器:更短、可排序的唯一識別碼工具

本頁面提供 ULID(Universally Unique Lexicographically Sortable Identifier)格式的唯一識別碼產生功能。使用者選定 ULID 作為格式,輸入 1 到 100 之間的數量後,工具立即產生對應數量的 26 字元字串,每組 ID 均為大小寫不敏感、不含連字號的可排序識別碼。

本頁工具的核心差異

與本站其他識別碼格式(如 UUID、NanoID)不同,ULID 固定使用 26 個字元(UUID 為 36 字元),且採用 Crockford base32 編碼,這使得 ULID 天生大小寫不敏感、不含連字號,也無需任何轉義即可用於 URL。前 10 個字元編碼 48 位元的毫秒時間戳,讓 ID 可以依建立時間進行詞彙排序;剩餘 16 個字元(80 位元)為亂數部分,構成總計 128 位元的值。

此頁面不提供大寫強制開關或連字號開關,因為 ULID 規範本身已定義為大小寫不敏感且無連字號。每一次格式切換、數量變更或任一設定調整,都會重新產生整份 ID 列表,確保輸出與當前設定一致。

ULID 的內部結構與編碼

ULID 的 128 位元空間切割如下:

部分 位元數 字元數 編碼方式 內容
時間戳 48 bits 10 chars Crockford base32 自 Unix epoch 以來的毫秒數
亂數 80 bits 16 chars Crockford base32 瀏覽器內 secure random 產生

Crockford base32 字母表包含 0–9 和 A–Z,但刻意移除了 I、L、O、U 這四個字母,以減少視覺混淆(例如 I 與 1、O 與 0)。由於字母與數字之間無大小寫對應問題,ULID 在接受輸入或比對時可忽略大小寫,但輸出通常以大寫呈現以便閱讀。

時間戳部分編碼的是建立時的毫秒時間,因此同一秒內的不同毫秒仍可區分順序。然而,若在同一個毫秒內產生多個 ULID,亂數部分無法保證升序排列——實作上建議在需要嚴格時間順序的應用中加入節流或額外排序機制。

與 UUID v4 及 UUID v7 的比較

特性 ULID UUID v4 UUID v7
字串長度 26 字元 36 字元(含連字號) 36 字元(含連字號)
時間可排序 是(毫秒精度) 否(純亂數) 是(毫秒精度,但格式含有連字號)
大小寫區分 不敏感 通常不區分(但非規範要求) 不敏感
連字號 4 個 4 個
URL 安全 完全(無需轉義) 需要轉義 - 已安全,但長度大 需要轉義
亂數位元數 80 bits 122 bits 74 bits(含版本欄位)
總位元數 128 bits 128 bits 128 bits

ULID 的壓縮優勢不僅在於字串短了十個字元,更因為省去連字號和大小寫模糊空間,在人工抄寫、口頭傳遞、資料庫索引等場景中更有效率。時間可排序性也讓 B-tree 結構的主鍵插入更趨近於附加而非隨機分裂,提升寫入效能。

排序行為與碰撞機率

由於前 10 字元編碼時間戳,任何兩個在不同毫秒產生的 ULID,其時間戳部分會直接決定字典序。若在同一毫秒內產生多個 ID,則亂數部分決定順序——但亂數不保證單調遞增,因此同一毫秒內的排序結果不可預測。

碰撞機率取決於亂數部分的熵(80 bits)。假設以每秒 1,000 個 ULID 的速率持續產生,經過約 2⁴⁰ 個 ID 後才有接近 50% 的碰撞風險,在一般應用中可視為可忽略。所有亂數均由 crypto.getRandomValues() 在瀏覽器本地產生,沒有任何資料傳送到伺服器,確保隱私與安全性。

使用場景與最佳實踐

  • Web 及行動開發者:需要可排序、URL 安全的短識別碼時,ULID 可直接作為 API 回應中的資源 ID,無需額外百分比編碼,且可被客戶端簡單排序。
  • 資料庫管理員:以 ULID 作為主鍵,特別是在使用 B-tree 索引的資料庫(如 PostgreSQL、MySQL)時,可減少頁面分裂並提升插入效能。
  • 分散式系統架構師:不同節點可獨立產生 ULID,只要確保節點間時間同步(如 NTP),即可獲取全局大致有序的識別碼,無須中央發號器。
  • API 設計師:公開 ID 使用 ULID 可避免連續數字被猜測,同時保留人類可讀性(無大小寫混淆、無連字號歧義)。

常見問題(FAQ)

Q1: ULID 和 UUID 長度差多少?
ULID 固定 26 字元,UUID 標準格式(含連字號)為 36 字元。ULID 約短 28%。

Q2: ULID 一定能按建立時間排序嗎?
同一毫秒內產生的多個 ULID,其亂數部分不保證排序;不同毫秒間則依時間戳嚴格排序。若需精確排序,建議在應用層加入序列號或使用時間精度更高的識別碼。

Q3: ULID 有連字號嗎?大小寫有影響嗎?
ULID 規範無連字號,且字母部分大小寫不敏感(但輸出通常為大寫)。輸入時可接受小寫。

Q4: 產生 ULID 時會連線到伺服器嗎?
不會。所有 ID 均在本機瀏覽器以 crypto.getRandomValues() 產生,不經網路傳送。

Q5: 為什麼 ULID 不包含字母 I、L、O、U?
Crockford base32 刻意移除這些字元以避免與數字 1、0 以及字母混淆,提升人眼辨識正確性。

Q6: 可以一次產生超過 100 個 ID 嗎?
此工具限制單次產生範圍為 1 至 100 個,若要更多請分批操作。