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 纳秒分辨率。