
UUID vs. ULID:选择合适的唯一标识符
在构建需要为记录生成唯一标识符的应用程序时,两种流行的格式脱颖而出:UUID(通用唯一标识符)和 ULID(通用唯一字典序可排序标识符)。了解它们的区别有助于你为用例选择正确的格式。

什么是 UUID?
UUID 由 RFC 4122 定义。最常见的变体 UUID v4 是 128 位的随机数据:
550e8400-e29b-41d4-a716-446655440000
格式:8-4-4-4-12 十六进制字符,用连字符分隔(共 36 个字符)。
UUID 版本
- v1:时间戳 + MAC 地址。可排序,但暴露硬件信息
- v4:随机。最广泛使用——不暴露任何信息
- v5:命名空间 + SHA-1 哈希。根据输入确定性生成
- v7(2023):Unix 时间戳 + 随机。可排序——现代推荐
- v8:自定义/应用定义的布局
什么是 ULID?
ULID 是一种 128 位标识符,设计为既唯一又自然可排序:
01ARZ3NDEKTSV4RRFFQ69G5FAV
结构:26 个字符,使用 Crockford 的 Base32(0-9 和 A-Z,排除 I、L、O、U 以提高可读性)
- 前 10 个字符:48 位 Unix 毫秒时间戳
- 后 16 个字符:80 位随机数

主要区别
| 属性 | UUID v4 | UUID v7 | ULID |
|---|---|---|---|
| 长度 | 36 字符(含连字符) | 36 字符 | 26 字符 |
| 可排序 | 否 | 是(按创建时间) | 是(按创建时间) |
| 基于时间戳 | 否 | 是(毫秒精度) | 是(毫秒精度) |
| 区分大小写 | 否 | 否 | 否 |
| URL 安全 | 否(有连字符) | 否(有连字符) | 是 |
| 毫秒内单调递增 | 否 | 可选 | 是(每个 ULID 递增) |
| 位数 | 128 位 | 128 位 | 128 位 |
数据库性能影响
UUID v4 索引问题
随机 UUID 作为主键时会导致数据库性能下降,原因如下:
- 新记录随机插入 B-tree 索引中
- 导致页分裂和碎片化
- 降低缓存效率(每次插入访问不同页面)

顺序 ID 更快
ULID 和 UUID v7 按时间顺序插入,这意味着:
- 新记录通常追加到索引末尾
- 更好的缓存利用率(最近的数据是“热”的)
- 更少的页分裂
- 基于时间的查询有更好的范围扫描性能
对于高写入负载,插入性能差异可达 2-10 倍。
何时使用 UUID v4
- 当需要与现有使用 UUID v4 的系统兼容时
- 当不得在 ID 中泄露时间戳信息时
- 当特别需要随机分布时
- 用于不作为数据库主键的标识符(会话令牌等)
何时使用 ULID 或 UUID v7
- 作为追加密集型表的主键
- 当 ID 应大致按时间可排序时
- 当需要 URL 安全的 ID 时(ULID 没有连字符)
- 用于跨多个节点生成 ID 的分布式系统
安全考虑
- UUID v4 和 ULID 不是加密安全的——不要将它们用作秘密令牌或认证密钥
- UUID v1 的 MAC 地址嵌入会暴露硬件信息(隐私问题)
- ULID/UUID v7 的时间戳暴露:任何拥有 ID 的人都可以大致确定记录的创建时间
对于秘密令牌(密码重置、API 密钥、会话 ID),请使用加密安全的随机生成器。
使用 UUID 和 ULID 生成器
我们的工具提供:
- 生成 UUID——支持版本 1、4、5 和 7
- 生成 ULID——按时间排序、URL 安全的标识符
- 批量生成——一次创建多个 ID
- 时间戳提取——对于 ULID 和 UUID v7,显示编码的时间戳
- 复制到剪贴板——单个或所有生成的 ID
用于测试、填充数据库、为模拟数据生成唯一标识符,以及理解不同 ID 格式的结构。