什么是 UUID
UUID(Universally Unique Identifier)是一种 128 位的唯一标识符,设计目标是在不需要中央协调的情况下生成全局唯一的 ID。UUID 的标准格式为:
550e8400-e29b-41d4-a716-446655440000
共 36 个字符(含 4 个连字符),分为 5 段,每段由 16 进制数字组成。
UUID 的版本
UUID v4(随机生成)
最常用的版本,完全由随机数生成。碰撞概率极低——生成 10 万亿个 UUID,碰撞概率仅为 50%。
格式:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
(4 = 版本号, y = 8/9/a/b)
适用场景:数据库主键、会话 ID、API 请求追踪
UUID v1(时间戳 + MAC)
基于当前时间戳和机器 MAC 地址生成。包含时间信息但暴露 MAC 地址,有隐私风险。
UUID v5(基于命名空间)
使用 SHA-1 哈希对命名空间 + 名称生成确定性 UUID。相同输入始终产生相同输出。
适用场景:需要可重现 ID 的场景(如 URL 的唯一标识)
NanoID:更短的替代方案
NanoID 是一种可配置长度的唯一 ID 生成器,默认使用 URL 友好的字符集(A-Za-z0-9_-):
NanoID (21位): V1StGXR8_Z5jdHi6B-myT
与 UUID v4 的对比:
| 特性 | UUID v4 | NanoID | |------|---------|--------| | 长度 | 36 字符 | 可配置(默认 21) | | 字符集 | 十六进制 | 64 个 URL 友好字符 | | 碰撞概率 | 2^-128 | 取决于长度和字符集 | | URL 友好 | 需要移除连字符 | 天然友好 |
ULID:带排序能力的唯一 ID
ULID(Universally Unique Lexicographically Sortable Identifier)结合了时间戳和随机数,支持按时间排序:
格式:01ARZ3NDEKTSV4RRFFQ69G5FAV (26字符, Crockford Base32)
| 特性 | UUID v4 | ULID | |------|---------|------| | 排序 | 无序 | 按时间有序 | | 长度 | 36 字符 | 26 字符 | | 可排序 | ❌ | ✅ | | 时间信息 | ❌ | ✅(前 10 位是时间戳) |
适用场景:需要按创建时间排序的主键、日志追踪
如何选择 ID 方案
| 场景 | 推荐方案 | |------|---------| | 数据库主键 | ULID(有序,索引友好) | | 会话/追踪 ID | UUID v4(标准、广泛支持) | | 短链接/邀请码 | NanoID(短、URL 友好) | | 可重现 ID | UUID v5(确定性) | | 分布式系统 | UUID v4 或 ULID(无需协调) |
使用在线 UUID 生成器
DevToolkit Pro 的 UUID 生成器 支持:
- UUID v4:一键生成,复制即用
- NanoID:可自定义长度和字符集
- ULID:带时间戳的可排序 ID
- 批量生成:一次生成多个 ID
FAQ
UUID 碰撞概率有多大?
UUID v4 的空间为 2^128 ≈ 3.4×10^38。生成 10 亿个 UUID,碰撞概率约为 10^-18(几乎为零)。在实际应用中,UUID 碰撞从未被确认发生过。
NanoID 比 UUID 安全吗?
取决于长度和字符集。21 位 NanoID(64 字符集)的熵约为 126 bit,与 UUID v4(128 bit)接近。选择足够长的 NanoID 即可。
为什么 ULID 比 UUID 适合做数据库主键?
数据库索引(如 B+Tree)对有序插入更高效。UUID v4 完全随机,每次插入都可能导致页分裂。ULID 按时间排序,插入模式更接近顺序写,性能更好。
本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页。