UUID 發電機

產生 v4(隨機)或 v7(按時間排序)格式的 UUID。

免費線上 UUID 生成器

UUID 對於資料庫主鍵、請求追蹤和分散式系統至關重要。 Dokall 產生符合 RFC 標準的 UUID v4(隨機)和 UUID v7(時間排序)值,您可以一鍵複製。

產生單一 UUID 或批次進行測試。所有生成都在您的瀏覽器本地進行 - 快速、私密且無速率限制。

什麼是 UUID?

UUID(Universally Unique Identifier,通用唯一標識符)是一個 128 位值,格式為五組共 32 個十六進制數字,以連字符分隔:550e8400-e29b-41d4-a716-446655440000。UUID 設計為在空間和時間上都唯一,無需中央機構分配。

UUID 用作數據庫主鍵、API 請求標識符、分佈式系統關聯 ID、檔案名和會話令牌。其關鍵優勢是任何系統都可獨立生成 UUID,且碰撞概率可忽略不計——約需生成 2.71 百京(quintillion)個 UUID,才有 50% 的概率出現一次碰撞。

UUID 版本説明

UUID 有多個版本,各自採用不同的生成策略。

UUID v1 將當前時間戳與機器的 MAC 地址組合。它具有唯一性,且大致按時間排序,但會泄露 MAC 地址和確切創建時間——在某些場景下存在隱私風險。

UUID v4 由密碼學安全的隨機數生成。128 位中有 122 位是隨機的(另有 6 位編碼版本和變體)。這是最常用的版本,因為簡單、私密,且抗衝突能力出色。

UUID v5(以及 v3)使用 SHA-1(v5)或 MD5(v3)對命名空間和名稱進行哈希,生成確定性 UUID。相同的命名空間和名稱總是得到相同的 UUID,適合從自然鍵生成一致的 ID。

UUID v7(RFC 9562,2024)在前 48 位編碼 Unix 時間戳,後接隨機數據。因此 v7 UUID 天然按時間排序,同時仍保持唯一。這對數據庫索引是一大優勢。

UUID v4 與 UUID v7 對比

UUID v4 完全隨機——沒有固有順序。作為帶 B-tree 索引的數據庫主鍵時,隨機 UUID 會使寫入分散到索引各處,導致快取利用率差、I/O 增加,即所謂的索引碎片。

UUID v7 在前 48 位嵌入時間戳,使 ID 隨時間單調遞增。新記錄追加到 B-tree 索引末尾,而不是隨機散落。這大幅提升寫入性能和索引局部性——基準測試中,在插入密集型工作負載下,v7 可比 v4 快 2–5 倍。

UUID v7 還能從 ID 本身提取近似創建時間戳,便於調試、排序和數據生命週期管理。代價是:v7 會暴露記錄創建時間,若創建時間敏感則需留意。

對新項目而言,除非你特別需要 v4 的非順序特性(例如防止對公網 ID 的枚舉攻擊),否則推薦使用 UUID v7。

將 UUID 用作數據庫主鍵

以 UUID 作為主鍵有明顯優勢:可在客户端生成而無需往返數據庫;跨表、跨庫唯一;且不暴露記錄數量或創建順序(v4)。因此非常適合分佈式系統、離線優先應用,以及不宜暴露順序 ID 的 API。

缺點是:UUID 為 16 字節,而整數 ID 通常為 4–8 字節,會增加存儲、內存佔用和連接成本。字符串形式(36 個字符)在基於文本的存儲中更大。隨機 UUID(v4)還會造成上文所述的 B-tree 索引碎片。

實用建議:使用 UUID v7 以避免索引碎片。將 UUID 存為 binary(16) 或原生 UUID 類型(PostgreSQL 有 uuid 類型),而不是 varchar(36)。若數據庫支持,使用 UUID 類型可獲得更好的存儲和比較性能。

UUID 與自增、ULID、Nano ID 對比

自增 ID(SERIAL、IDENTITY)是由數據庫分配的順序整數。緊湊(4–8 字節)、索引快、易讀。缺點:生成需要往返數據庫;會暴露記錄數量和創建順序;且跨表或跨庫不唯一。

UUID 全局唯一,可在任意處生成。缺點:存儲更大(16 字節),且 v4 會造成索引碎片(可由 v7 解決)。

ULID(Universally Unique Lexicographically Sortable Identifier)是 128 位 ID,帶 48 位時間戳前綴,類似 UUID v7,但字符串表示更緊湊(26 個 Crockford Base32 字符,對比 36 個十六進制字符)。ULID 可按時間進行字典序排序。

Nano ID 可生成可配置字母表和長度的隨機字符串 ID。21 字符的 Nano ID 抗衝突能力大致與 UUID v4 相當,但更短。適合需要 URL 友好 ID、又不需要完整 128 位 UUID 格式的場景。

簡單單庫應用可選自增;分佈式系統或 API 可選 UUID v7;在意字符串長度時可選 ULID 或 Nano ID。

常見問題

兩個 UUID 有可能相同嗎?
理論上有可能。對 UUID v4 而言,生成兩個相同 UUID 的概率極低——大約需要生成約 2.71 × 10^18(2.71 百京)個 UUID,才有 50% 的衝突概率。實踐中可視為不可能。全球每天各系統生成的 UUID 數量,遠超你一生所能生成的總量,且從未觀察到真實衝突。
UUID v4 和 UUID v7 有什麼區別?
UUID v4 完全隨機(122 位隨機位)。UUID v7 在前 48 位嵌入 Unix 毫秒時間戳,後接隨機數據。因此 v7 UUID 按時間排序,能顯著提升帶 B-tree 索引的數據庫插入性能。數據庫鍵推薦用 v7;需要非順序、不暴露時間的 ID 時用 v4。
數據庫該用 UUID 還是自增 ID?
簡單、單庫應用,且順序 ID 不構成安全隱患時,可用自增。需要全局唯一 ID、客户端生成 ID、跨庫唯一,或不宜在 API 中暴露順序 ID 時,使用 UUID(優先 v7)。UUID 的存儲開銷(16 字節對比 4–8 字節)對現代數據庫很少成為實際問題。
UUID 有多長?
UUID 是 128 位(16 字節)二進制數據。標準字符串表示為 36 個字符:32 個十六進制數字加 4 個連字符,格式為 8-4-4-4-12(例如 550e8400-e29b-41d4-a716-446655440000)。存入數據庫時,應使用 binary(16) 或原生 UUID 列類型,而不是 varchar(36),以獲得更好性能。
UUID 是順序的嗎?
UUID v4 不是順序的——它完全隨機。UUID v1 和 v7 因包含時間戳而大致順序。UUID v7 專門設計為單調遞增,非常適合數據庫索引。若需要非順序 ID(防止枚舉),請使用 v4。
什麼是 ULID?它與 UUID 有何不同?
ULID(Universally Unique Lexicographically Sortable Identifier)是帶 48 位時間戳前綴和 80 位隨機數的 128 位 ID。它類似 UUID v7,但使用更緊湊的 Crockford Base32 編碼(26 個字符,對比 UUID 的 36 個)。ULID 可按創建時間以字符串排序。若需要按時間排序且字符串更短的 ID,可選擇 ULID。
可以從 UUID 中提取時間戳嗎?
從 UUID v1 和 v7 可以。UUID v7 在前 48 位存儲 Unix 毫秒時間戳,可提取以確定 UUID 的生成時間(毫秒精度)。UUID v4 不含時間戳——完全隨機。UUID v1 也含時間戳,但使用不同紀元(1582 年 10 月 15 日)和 100 納秒分辨率。