什么是 UUID?
UUID(通用唯一标识符)是一种标准化的标识符格式,旨在在空间和时间上全局唯一。UUID 是 128 位的值,通常表示为 32 个十六进制数字,分为五组并用连字符分隔:123e4567-e89b-12d3-a456-426614174000
。
UUID 由 RFC 9562 标准定义(取代了之前的 RFC 4122),用于计算机平台中标识信息,而无需集中注册或协调。
UUID 的格式
所有 UUID 都具有一个通用格式,由 36 个字符组成(32 个十六进制数字加 4 个连字符),按照以下模式组织:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
其中:
x
是任意十六进制数字(0-9,a-f)M
表示 UUID 的版本(1-7)N
表示 UUID 的变体(通常为 8、9、A 或 B,用于现代 UUID)
UUID 版本比较
版本 | 名称 | 生成方法 | 按时间排序 | 使用场景 |
---|---|---|---|---|
UUID v1 | 时间戳 | 当前时间戳 + 节点 ID(MAC) | 是(部分) | 日志记录,分布式系统 |
UUID v3 | 基于名称(MD5) | 命名空间 + 名称的 MD5 哈希 | 否 | 相同输入生成一致的 ID |
UUID v4 | 随机 | 随机数或伪随机数 | 否 | 通用用途,最常用 |
UUID v5 | 基于名称(SHA-1) | 命名空间 + 名称的 SHA-1 哈希 | 否 | 更强哈希的一致 ID |
UUID v6 | 重新排序的时间戳 | 时间戳(按排序顺序) | 是 | 数据库键,按时间排序的日志 |
UUID v7 | Unix 时间戳 | Unix 时间戳 + 随机数据 | 是 | 现代可排序标识符 |
Nil UUID | 空 UUID | 全为零 | N/A | 特殊值,未初始化标记 |
UUID 的优势
- 无需协调:生成 ID 时无需集中协调
- 全局唯一性:碰撞概率极低
- 固定长度:一致的 36 个字符表示
- 跨平台:几乎兼容所有编程语言
- 多功能:不同版本适用于不同使用场景
UUID 的非标准替代方案
ID 类型 | 描述 | 优势 | 劣势 |
---|---|---|---|
GUID | 微软的 UUID 实现 | 功能上等同于 UUID | 在旧系统中可能有实现差异 |
ULID | 通用唯一可排序标识符 | 按字典顺序排序,时间戳优先,不区分大小写 | 较新技术,采用率较低 |
Snowflake ID | Twitter 的分布式 ID 系统 | 按时间排序,紧凑(64 位) | 需要集中协调 |
CUID/CUID2 | 抗碰撞 ID | 短小,适合客户端生成 | 非官方标准 |
Nano ID | 生成小型、安全且适合 URL 的唯一字符串 | 比 UUID 更小,可配置字母表 | 非标准化 |
Short UUID | UUID 标准的更短编码 | 更紧凑的表示 | 需要转换为/从标准 UUID |
Nil UUID | 所有位为零的 UUID | 特殊语义意义 | 非唯一(用作特殊值) |
Minecraft UUID | 带或不带连字符的 UUID | 与标准 UUID 兼容 | 仅格式差异 |
实际应用
- 数据库主键:特别是在分布式或复制数据库中
- 分布式系统:在多个系统中标识实体
- Web 应用:会话 ID,匿名用户跟踪
- 内容管理:文档和媒体标识符
- API:请求和事务标识符,用于跟踪和调试
- 物联网:无需集中注册即可标识设备
- 数据同步:在多个数据存储中标识记录
- 软件许可:唯一的产品或许可证密钥