什么是UUID?
UUID(Universally Unique Identifier,通用唯一识别码)是一个128位的标识符,通常表示为36个字符的字符串,包含32个十六进制数字和4个连字符,形如:550e8400-e29b-41d4-a716-446655440000。UUID由开放软件基金会(OSF)在分布式计算环境(DCE)中标准化,RFC 4122是其现行规范。GUID(Globally Unique Identifier)是微软对UUID的实现称谓,两者在日常语境中基本等同。
UUID的核心价值在于"去中心化的唯一性"——不需要中央协调(如数据库自增ID的分配),不同设备、不同时间独立生成的UUID也几乎不可能重复。UUID v4使用122位随机数,理论碰撞概率约为2^-122,即使每秒生成10亿个UUID,运行100年发生一次碰撞的概率也低于50%。这使它成为分布式系统ID生成的首选方案。
UUID的版本区别
- v1(时间戳+MAC):基于时间与网卡地址,可反推生成时间与设备,存在隐私风险
- v3/v5(命名空间哈希):对指定命名空间内的名称做MD5/SHA1哈希,同名生成同ID,适合幂等场景
- v4(随机):122位密码学随机数,最常用、最安全,本工具生成的即是v4
- v6/v7(新式有序):时间前缀排序友好,适合做数据库索引主键(v7兼容毫秒时间戳)
UUID的常见用途
- 数据库主键:分布式数据库、多主架构中避免ID冲突
- 分布式追踪:请求链路追踪的TraceID、SpanID
- 文件与对象命名:对象存储的文件名,避免覆盖与猜测
- 会话与令牌:临时会话ID、激活码、设备指纹等
- 测试数据:单元测试与演示环境的数据填充
常见问题解答(FAQ)
Q: 生成的UUID会重复吗?
实际使用中不会。UUID v4包含122位随机数,碰撞概率约2^-122。使用浏览器crypto API(密码学安全随机源)生成,随机性有保障,重复概率在工程上可忽略不计。
Q: UUID与自增ID哪个做主键更好?
各有利弊:自增ID有序、占用空间小、索引效率高,但暴露业务量且分布式下需要协调;UUID无冲突风险、可离线生成,但36字节较长且无序插入会导致索引页分裂。MySQL InnoDB常用"业务自增+外部UUID"组合,或使用有序UUID(v7/雪花算法)兼顾两者。
Q: 大写和标准小写的UUID等价吗?
等价。UUID规范规定十六进制字母大小写不敏感,比较时应统一大小写后进行。部分老系统(如早期Windows注册表)习惯使用大写格式。
Q: 生成的UUID可以用于激活码吗?
UUID的唯一性满足激活码需求,但UUID没有校验位且字符集较大,人工输入易错。如需人工输入的激活码,建议使用去掉易混淆字符(0/O、1/I/L)的短码方案。
Q: UUID泄露隐私吗?
UUID v4为纯随机数,不包含任何设备或时间信息,可安全对外展示。但请避免使用v1 UUID对外,因为它包含MAC地址与时间戳信息。