Nano ID 產生器:長度、字母表與碰撞抵抗的完整控制
這個頁面提供了一個純客戶端的 Nano ID 產生工具。與固定長度 36 字元的 UUID 或 26 字元的 ULID 不同,Nano ID 的預設長度為 21 個字元,卻能提供可比的碰撞抵抗能力。更關鍵的是,您可以自由調整長度(2 到 36)與允許使用的字母表(至少需包含兩個不同字元),以符合嚴格的格式限制或最佳化儲存效率。所有 ID 均在瀏覽器內透過 crypto.getRandomValues 生成,絕不會傳送到 BroBroGo 或任何伺服器。
為何長度與字母表可以調整?
Nano ID 的設計核心是「可自訂性」。預設的 21 字元使用 URL 安全字母表(A-Za-z0-9_-,共 64 個字元),這個組合在碰撞機率與長度之間取得平衡。但實際應用可能需要更短的 ID(例如 QR 碼空間有限),或者需要排除容易混淆的字元(如 0OIl)。透過調整長度與字母表,您可以控制:
- 碰撞機率:長度越長、字母表越大,碰撞機率越低。公式近似
(字母表大小^長度) / (ID總數)^2 * 100%。例如 21 字元、64 字元字母表,產出 100 萬個 ID 時碰撞機率約為十億分之一。 - 儲存與傳輸開銷:較短的 ID 減少資料庫欄位長度,也利於 URL 或 API 回應縮小。
- 格式相容性:某些系統只接受純數字或特定大小寫,您可以將字母表設為
0123456789或ABCDEF。
每次修改長度、字母表或數量後,工具會立即重新產生 ID,並顯示新結果。目前狀態顯示「Ready.」表示閒置,產生後變為「Generated.」,複製全部後則顯示「Copied all!」。
與 UUID、ULID 的具體比較
| 格式 | 預設長度 | 字元集 | 碰撞抵抗 | 可調整性 |
|---|---|---|---|---|
| UUID (v4) | 36 (含連字號) | 十六進位 (0-9a-f) | 極高(122 位元隨機) | 無 |
| ULID | 26 | Crockford 32 (0-9 A-Z 不含 ILOU) | 高(128 位元,含時間戳) | 有限 |
| Nano ID | 21 (可調 2-36) | URL 安全 64 字元 (可自訂) | 可調整 | 完全 |
Nano ID 的優勢在於:您可以在保持可接受碰撞機率的前提下,將長度壓到比 UUID 短 42%。若將長度設為 12 字元、使用全部 64 字元,其碰撞機率仍遠低於常見的亂數產生器。但請注意,當長度縮短或字母表字元數減少時,碰撞風險會急遽上升。工具會強制字母表至少包含兩個不同字元;若輸入單一字元,結果會被清空,ID 計數顯示 0,且「Copy all」按鈕停用。
邊界情況與操作規則
- 長度範圍:2 到 36。低於 2 無意義;超過 36 會使 ID 過長,但工具上限為 36。
- 字母表驗證:必須包含至少兩個不同字元。如果您只想用數字,請輸入
0123456789(10 個不同字元)。若誤刪成只剩一個字元,例如只留a,則所有 ID 消失,計數歸零。 - 數量:每次產生 1 到 100 個 ID。點擊單個 ID 可複製到剪貼簿。
- 格式下拉選單:目前固定為 Nano ID,未實作其他格式,但保留了擴充空間。
- 即時再生:任何選項變動(包含切換格式,若未來有其他格式)都會重新執行生成。
這些規則防止了無效輸入導致無限迴圈或未定義行為。例如,長度設 2 但字母表僅 2 字元時,可產生 4 種組合;若數量要求 100 個,則無法產生唯一 ID?但工具目前並未保證 ID 唯一性(若同一組參數產生碰撞風險),僅使用隨機取樣。實務上,若 字母表大小^長度 小於要求的數量,仍會強制產生指定數量的 ID,但碰撞機率極高。使用者應自行注意此極端情況。
瀏覽器端生成的隱私與安全
所有隨機性來自 crypto.getRandomValues(),這是瀏覽器提供的加密安全亂數,適用於生成 token、session ID 等敏感用途。與伺服端生成相比,客戶端生成有以下優點:
- 零網路傳輸:您輸入的參數與產生的 ID 不會離開本機。
- 無資料留存:工具不會記錄任何歷史。
- 離線可用:頁面資源載入後,即使斷網仍可正常產出。
這對於處理機密資料(如 API 金鑰、一次性驗證碼)的開發者特別重要。您可以確定沒有任何第三方伺服器能窺見所產生的 ID。
實際應用場景建議
- 資料庫主鍵:取代自動遞增整數或 UUID。21 字元的 Nano ID 比 UUID 短 15 個字元,可減少索引大小,尤其在高併發寫入時有優勢。
- 短網址:將字母表限制為大寫字母與數字(36 字元),長度設 6 可產生約 21 億個不重複 ID。若每日僅產生數萬個,碰撞風險極低。
- 唯一交易序號:使用字母與數字混合,長度 12 即可滿足大部分商業應用。
- QR 碼內容:短 ID 能降低 QR 碼的密度,提高掃描成功率。可進一步調整字母表避開
%、#等在 URL 中需轉義的字元。
常見問題 FAQ
Q: Nano ID 預設長度為何是 21?
A: 21 字元搭配 64 字元字母表時,每 ID 包含 21 × log₂64 = 126 位元隨機性,接近 UUID v4 的 122 位元,碰撞機率相當,但長度減少 42%。
Q: 我可以完全自訂字母表嗎?可以包含中文字元嗎?
A: 可以。字母表是任意文字字串,但必須至少含兩個不同字元。中文字元(如「中文」)也可使用,但會大幅增加字元數(Unicode BMP 區約 2 萬字),且生成的 ID 不再是 URL 安全。一般建議維持 ASCII 可列印字元以利傳輸。
Q: 如果我把長度設為 2、字母表設為「ab」,會發生什麼?
A: 每次取樣會從 ab 中隨機選 2 次,產生如 aa、ab、ba、bb 等結果。因僅 4 種可能,如果數量超過 4,必定出現重複 ID。工具不強制唯一性,但您可透過增加長度或擴大字母表來降低碰撞。
Q: 如何估算所需的最小長度?
A: 可使用公式:最小長度 ≈ log(總預估 ID 數量) / log(字母表大小) + 幾個備用位元。例如預計產生 1000 萬個 ID、使用 64 字元字母表,長度 5 的組合數為 64⁵ ≈ 10.7 億,理論碰撞機率約萬分之一。若要小於十億分之一,建議長度 7 以上。
Q: 「Copy all」按鈕何時會停用?
A: 當字母表僅包含一個字元時,結果清空、ID 計數為 0,此時「Copy all」按鈕禁用。恢復為至少兩個不同字元的字母表後即重新啟用。
Q: 這個工具會將產生的 ID 儲存在伺服器嗎?
A: 不會。所有計算在瀏覽器 JavaScript 引擎中完成,無任何資料傳輸。您可以關閉網路後仍然正常使用。