Nano ID 生成工具

在瀏覽器中批次生成 URL 安全的簡短唯一 ID。可自由指定字元集(預設、字母數字、小寫、大寫、數字、十六進位制)和長度,非常適合需要比 UUID 更短的 ID 的場景。

ID 格式對比

格式 長度 字元集大小 能否按生成順序排序 說明
Nano ID 預設21個字元(可指定1〜64個字元) 64個字元 不能(完全隨機) 僅由 URL 安全字元組成的短隨機 ID,可自由更改字元集和長度。
UUID v4 36個字元(含4個連字元) 16個字元(十六進位制) 不能(完全隨機) 由 RFC 9562 標準化的128位識別符號,以連字元分隔的十六進位制表示法為標準格式。
ULID 26個字元 32個字元(Base32) 能(前10個字元為時間戳) 開頭帶有毫秒級時間戳,因此可以按字串順序排列生成順序。

使用技巧

  • Nano ID 使用基於 Web Crypto API 的密碼學安全隨機數生成,且全部在瀏覽器內處理,不會發送到 toolbase.cc 的伺服器。
  • 預設的64字元字母表(A-Za-z0-9_-)不含符號或空格,可以直接安全地用作URL 路徑或檔名
  • 將字元集限定為"僅數字"或"十六進位制",可以生成符合現有系統 ID 格式(例如訂單編號僅為數字)的 ID。
  • 長度越短,碰撞機率越高。發行量大的系統建議保持預設的21個字元左右,少量測試資料用8〜10個字元左右也可能足夠。
  • 增加生成數量後使用"全部複製",便於批次建立測試資料或種子資料。

常見問題

如果想直接將短 ID 用於 URL 或檔名,Nano ID 更合適。如果需要 RFC 標準化的格式,或者重視與其他系統的互操作性,UUID(尤其是 v4)是更穩妥的選擇。

在預設的21個字元、64種字元的設定下,具有相當於126位的隨機性,實際使用中的碰撞機率幾乎可以忽略。計算得出,碰撞機率達到50%所需的生成數量約為1.09×10¹⁹個。

可以,但和 UUID v4 一樣是完全隨機的,因此插入 B-Tree 索引的效率不如 AUTO_INCREMENT。如果需要按插入順序排序,建議考慮使用開頭帶時間戳的 ULID 等方案。

是的。即使長度相同,字元集大小(字母表大小)越小,隨機性越低(抵禦碰撞的能力也越弱)。若要用僅數字(10種字元)達到與64種字元字母表相同的安全性,需要更長的字元數。
ツールくん

閒話 ― 為什麼 Nano ID 能比 UUID 更短

Nano ID 是 PostCSS 的開發者 Andrey Sitnik 於2017年釋出的 JavaScript ID 生成庫。它沒有依賴項,程式碼量僅有幾百位元組,卻使用密碼學安全的隨機數,這種設計獲得了廣泛認可,如今在 npm 上每週下載量達數千萬次,成為常用庫之一。

ID 的長度取決於所用字元集的大小。UUID 僅使用十六進位制(16種字元)來表示128位,因此需要36個字元;而 Nano ID 使用64種字元,僅用21個字元就能表示相當程度的隨機性(預設設定下為126位)。這是因為每個字元所攜帶的資訊量(log₂64=6位)大於十六進位制(log₂16=4位),這正是縮短長度的原因。

預設設定(21個字元、64種字元)所具有的126位隨機性,與 UUID v4 的122位幾乎相當。根據生日問題的近似公式計算,碰撞機率達到50%所需的生成數量約為1.09×10¹⁹個,實際使用中幾乎無需擔心。