为什么唯一ID比看起来更复杂
你需要为数据库行、API资源、会话令牌生成唯一标识符。简单,对吧?用一个数字就行了。
顺序整数的问题:它们是可预测的(/users/1、/users/2)——任何人都可以枚举你的资源。它们需要一个中央权威(只有一台服务器能决定"下一个"数字)。而且它们会泄露业务信息(你的第1000个订单ID就是1000)。
于是世界发明了更好的ID方案。然后不断发明新的。以下是每种方案的真实功能。
UUID(v4)——默认安全选项
格式: 550e8400-e29b-41d4-a716-446655440000
长度: 36个字符(32位十六进制 + 4个连字符)
随机性: 122位
UUID v4是以标准格式表示的122位随机数。碰撞概率低得惊人(每秒生成10亿个UUID持续85年,才有50%的碰撞概率),实际上不可能发生。
UUID的优点:
- 通用标准——每种语言、数据库和框架都有原生支持
- 无需协调——任何服务器或客户端都可以独立生成
- 非顺序——不存在枚举攻击
UUID的缺点:
- 不可排序——UUID是随机的,不能按创建时间排序。在B树索引(大多数数据库的工作方式)中,随机插入会导致"页面分裂"——数据库不断重组其索引。大规模时,这代价高昂。
- 较大:字符串形式36个字符,二进制16字节
- 不是URL友好的(包含连字符)
何时使用UUID v4: 需要广泛支持的标准ID,且不关心排序顺序时。
UUID v7——改进版UUID
格式: 018e2c4c-3d12-7f3a-91f8-3e4a5b6c7d8e
长度: 36个字符
随机性: 74位(带48位毫秒时间戳前缀)
UUID v7(2023年批准)是带时间戳前缀的UUID。前48位是毫秒级Unix时间戳,使UUID可按创建时间排序。
为什么重要: 可排序ID = B树顺序插入 = 大规模时数据库索引性能大幅提升。
何时使用UUID v7: 想要UUID兼容性,但需要按时间排序的ID来提升数据库性能时。
ULID——可排序、URL安全的UUID替代方案
格式: 01ARZ3NDEKTSV4RRFFQ69G5FAV
长度: 26个字符
随机性: 80位(带48位毫秒时间戳前缀)
ULID(通用唯一字典序可排序标识符)用更简洁的格式解决了UUID的排序问题。它将48位时间戳 + 80位随机数编码为Crockford Base32(无连字符,无歧义字符)。
ULID的优点:
- 字典序可排序(作为字符串正确排序)
- URL安全(无连字符或特殊字符)
- 26个字符 vs UUID的36个——更紧凑
- 内嵌毫秒精度时间戳
ULID的缺点:
- 不如UUID通用——大多数语言需要额外库
- 单调性:同一毫秒内生成的多个ULID在不使用单调变体时可能无法正确排序
何时使用ULID: 想要既可排序又紧凑、URL安全的ID,且不需要UUID兼容性时。
CUID2——URL安全、抗碰撞、无时间戳
格式: clyg4v5l20000356ok1f5t6nb
长度: 24个字符(默认)
随机性: 高(SHA-3指纹,无可预测结构)
CUID2专为安全敏感场景设计。与ULID不同,它故意没有时间戳前缀——无法从ID推断资源的创建时间。
CUID2的优点:
- 比UUID/ULID更安全用于公开ID(无时序信息)
- URL安全
- 可配置长度(在长度和抗碰撞性之间权衡)
CUID2的缺点:
- 不可排序(设计如此)
- 支持不如UUID广泛
- 依赖特定库
何时使用CUID2: ID是公开的,且不想泄露创建时间戳时(用户ID、API密钥、短链接)。
NanoID——小巧、快速、可定制
格式: V1StGXR8_Z5jdHi6B-myT
长度: 21个字符(默认,可配置)
字符集: 可定制(默认:URL安全的Base64)
NanoID是UUID的现代轻量替代方案。21个字符内与UUID v4相同的碰撞概率,但更小且字符集可定制。
NanoID的优点:
- 最紧凑(21个字符 vs UUID的36个)
- 可定制字符集——可以只用小写字母、只用数字等生成ID
- 支持20+种语言
- 速度快
NanoID的缺点:
- 不可排序
- 不是标准(无RFC)
何时使用NanoID: 大小很重要时(URL、短令牌),或需要自定义字符集时。
决策表
| UUID v4 | UUID v7 | ULID | CUID2 | NanoID | |
|---|---|---|---|---|---|
| 可排序 | ✗ | ✓ | ✓ | ✗ | ✗ |
| URL安全 | ✗ | ✗ | ✓ | ✓ | ✓ |
| 标准(RFC) | ✓ | ✓ | ✗ | ✗ | ✗ |
| 数据库性能 | 差 | 好 | 好 | 差 | 差 |
| 隐藏时间戳 | ✓ | ✗ | ✗ | ✓ | ✓ |
| 大小(字符) | 36 | 36 | 26 | 24 | 21 |
简单答案
- 默认选择: UUID v7——可排序、标准、数据库性能好
- 需要URL安全+可排序: ULID
- 公开ID(不泄露时序): CUID2
- 短令牌、自定义字符集: NanoID
- 遗留系统/最大兼容性: UUID v4
立即生成ID
UUID生成器可生成UUID v4和v7——批量生成,一键复制。无需注册账号。