什么是 UUID?
UUID(通用唯一标识符)是 RFC 9562 标准化的 128 位标识符格式。规范文本形式由 32 个十六进制数字组成,并按 8-4-4-4-12 分为五组;唯一性取决于所选版本与正确生成器,并非无条件保证。
快速了解
| 全称 | 通用唯一标识符 |
|---|---|
| 创建时间 | 起源于 1980 年代;现行标准 RFC 9562 发布于 2024 年 |
| 规范文档 | 官方规范 |
工作原理
UUID 即通用唯一标识符,在 Microsoft 生态中常称 GUID。2024 年发布的 RFC 9562 取代 RFC 4122,并定义了语义不同的多个版本。UUID v4 使用 122 个随机位;UUID v5 用 SHA-1 对命名空间与名称进行确定性哈希,用于标识符兼容而非安全;UUID v7 在高位放置 48 位 Unix 毫秒时间戳,其余版本字段用于随机数据和可选单调生成方法。RFC 9562 建议在可能时用 v7 代替 v1 或 v6,但没有要求所有 v4 场景改用 v7。V7 可能改善索引局部性,不过严格顺序和性能仍取决于时钟、生成器状态、并发、数据库与存储格式。应用应设置唯一约束,并把授权与标识符分离。
主要特点
- 128 位布局包含版本、变体和版本特定数据
- 规范文本格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- 不同版本分别支持随机、名称确定和时间相关生成
- 正确实现所选算法时可以不依赖中央分配器生成
- 碰撞风险是概率问题,唯一性关键场景仍需数据库唯一约束
- 十六进制文本不区分大小写,但 RFC 规范形式使用小写
常见用途
- 分布式系统中的数据库主键
- Web 应用中的非秘密资源标识与关联 ID
- 文件和资源命名
- 微服务中的事务 ID
- 设备标识
示例
Loading code...常见问题
UUID 和 GUID 有什么区别?
GUID 是 Microsoft 对 128 位标识符的常用名称,UUID 是 RFC 术语。二者的字符串形式通常可以互操作,但某些 API 的字节顺序和序列化惯例不同,不能假设所有二进制表示都可直接互换。
应该使用哪个 UUID 版本?
需要随机标识符且不希望嵌入创建时间时可用 v4;关注近似时间顺序与索引局部性时可评估 v7,同时考虑时间戳暴露和时钟行为;只有需要命名空间与名称确定生成时才用 v5。RFC 9562 建议在可能时以 v7 代替 v1 或 v6,而不是代替所有 v4 用途。
UUID 碰撞真的会发生吗?
会。正确使用密码学随机生成器时,v4 拥有 122 位随机空间,在通常规模下碰撞概率极低,但并非不可能。容量分析应使用生日界,数据库应设置唯一约束,并在冲突时重试或安全失败。随机源损坏或重复对风险的影响可能远高于理论概率。
如何在不同编程语言中生成 UUID?
生成 v4 可使用 JavaScript 的 crypto.randomUUID()、Python 的 uuid.uuid4()、Java 的 UUID.randomUUID()、.NET 的 Guid.NewGuid() 或维护中的 Go UUID 包。生成 v7 时应核对运行时或库的准确版本及单调行为。不要用 PHP uniqid()、单独时间戳或 Math.random() 代替 UUID 生成器。
数据库主键应该使用 UUID 还是自增 ID?
应根据协调、合并、存储、索引、隐私和暴露要求选择。数据库原生 16 字节 UUID 类型可避免文本开销;v7 相比随机 v4 可能改善局部性,但需要在真实并发和时钟行为下测试;自增键紧凑有序,却需要分配协调。两种标识符都不提供授权,也不应被当作秘密。