什么是 UUID?
UUID(Universally Unique Identifier,RFC 4122 / RFC 9562)是 128 位标识符,无需中央分配机构即可创建,并在全球范围内实际唯一。文本形式为 32 个十六进制字符,按 `8-4-4-4-12` 用连字符分为五段,含分隔符共 36 字符。
存在多个版本。v1 使用时间 + MAC 地址(隐私问题);v3 与 v5 由 namespace + name 推导(确定性);v4 完全随机(现代默认);v7 按时间排序,解决 v4 在数据库索引中的问题。
此外,ULID 与 NanoID 是流行的非 IETF 备选。ULID 是 26 字符可排序字符串,NanoID 是简短 URL 安全 ID(常为 21 字符)。具体选哪种主要看存储与 URL 布局。
v4 与 v7 与 ULID 与 NanoID
四种最重要变体的快速对比:
| 格式 |
长度 |
字母表 |
可排序 |
主要用途 |
| UUID v4 |
36 (32 hex + 4 dash) |
0-9 a-f |
否(随机) |
通用默认,适合内部 ID |
| UUID v7 |
36 |
0-9 a-f |
是(时间排序,48 位 ms) |
数据库主键(B-Tree 友好) |
| ULID |
26 |
0-9 A-Z (ohne I, L, O, U) |
是(时间排序) |
URL / 日志,比 hex 更易读 |
| NanoID-21 |
21 |
A-Z a-z 0-9 _ - |
否(随机) |
短 URL slug、分享链接 |
Crockford base32(ULID)省略了 I、L、O、U,避免与 1、0、V 混淆。
为什么生产环境不用自增 ID?
自增 ID(例如 `BIGINT IDENTITY` 或 `SERIAL`)简单、快、索引友好,但不满足若干现代需求:
- 泄露业务指标:竞争对手看到两个连续订单号就能粗略推算每日订单量。
- 无法防爬:`/users/123` 是任何暴破爬虫都会从 1 走到 n 的对象,每个 ID 都可枚举。
- 阻碍分布式系统:多区域部署或离线客户端(移动端、边缘)需协调序列或运行中央 ID 服务。UUID 完全避免这点。
- 无法客户端预分配:前端在 INSERT 之前无法预定一个自增 ID(例如乐观 UI)。UUID 在客户端生成后随 INSERT 一起传递。
- 不利于测试:回滚数据的测试会与 sequence 冲突或留空洞。UUID 在测试中保持稳定。
建议:纯运维表(迁移日志、计数器)继续用自增 ID;领域实体(User、Order、Document)默认主键用 UUID v7。
在 KernelHost 部署高吞吐后端
如果你每天在数据库中存储数百万 UUID,需要 NVMe 存储、ECC 内存和稳定网络。KernelHost 在 Frankfurt FRA01 自营独立服务器与 VPS,含 DDoS 防护、IPv4 + IPv6 与 1 Gbit/s。对德国和奥地利客户低 RTT,价格合理。公司位于 Wien(AT),数据中心在 Frankfurt(DE)。