正在加载,请稍候…

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 格式的结构。