正在加载,请稍候…

UUID 与 ULID:你应该使用哪种唯一 ID?

比较 UUID 和 ULID 在唯一标识符生成中的差异,了解何时使用每种 ID 以及它们在可排序性和数据库性能上的区别。

UUID vs ULID:你应该使用哪种唯一 ID?

UUID vs. ULID:选择合适的唯一标识符

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

UUID vs ULID:你应该使用哪种唯一 ID?插图

什么是 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 vs ULID:你应该使用哪种唯一 ID?插图

主要区别

属性 UUID v4 UUID v7 ULID
长度 36 字符(含连字符) 36 字符 26 字符
可排序 否 是(按创建时间) 是(按创建时间)
基于时间戳 否 是(毫秒精度) 是(毫秒精度)
区分大小写 否 否 否
URL 安全 否(有连字符) 否(有连字符) 是
毫秒内单调递增 否 可选 是(每个 ULID 递增)
位数 128 位 128 位 128 位

数据库性能影响

UUID v4 索引问题

随机 UUID 作为主键时会导致数据库性能下降,原因如下:

  • 新记录随机插入 B-tree 索引中
  • 导致页分裂和碎片化
  • 降低缓存效率(每次插入访问不同页面)

UUID vs ULID:你应该使用哪种唯一 ID?插图

顺序 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 生成器

我们的工具提供:

  1. 生成 UUID——支持版本 1、4、5 和 7
  2. 生成 ULID——按时间排序、URL 安全的标识符
  3. 批量生成——一次创建多个 ID
  4. 时间戳提取——对于 ULID 和 UUID v7,显示编码的时间戳
  5. 复制到剪贴板——单个或所有生成的 ID

用于测试、填充数据库、为模拟数据生成唯一标识符,以及理解不同 ID 格式的结构。