什么是UUID,能保证唯一吗?
面试回答¶
面试官: 什么是UUID?它能保证唯一吗?
你:
UUID 全称 Universally Unique Identifier,是一个128位的全局标识符,通常展现为32位十六进制字符串,由短横线分组成8-4-4-4-12格式。它不依赖中央协调机构,由各系统独立生成,目标就是“几乎不可能”出现重复。
常见的版本有:
-
UUIDv1:基于 MAC 地址 + 时间戳,能反推生成时间和机器,有暴露隐私的风险。
-
UUIDv4:完全用随机数生成。目前应用最广,日常说的 UUID 基本就是这个。
-
UUIDv7:用时间戳(毫秒精度)+ 随机数,既大致有序又不易被推测,适合数据库主键。
那它真能保证绝对唯一吗?
从数学上讲,不能保证绝对唯一,因为128位空间虽然极大,但仍然是有限的,理论上存在重复概率,只是这个概率低到可以忽略不计。
拿 UUIDv4 来说,它的 122 位是随机生成的。以每秒产生 10 亿个 UUID 的速度,连续产生 100 年,产生重复的概率大约只有 50%(参考生日悖论计算)。现实中根本达不到这种量级,所以碰撞概率远低于硬件故障、宇宙射线导致的内存翻转。可以认为“实际唯一”,但不是数学绝对唯一。
实际风险点在于实现层面而非理论层面:
-
随机数生成器种子质量差:如果用了不安全的伪随机数生成器,或者多机在同一毫秒内从相同种子启动,就可能产生相同 UUID。
-
时钟回拨:对 v1/v7 等依赖时间的版本,如果机器时钟被 NTP 大幅回调,且没有处理好,可能产生重复。
-
人为错误或代码 bug:比如错误地截取了 UUID 的一部分当全局 ID 使用,那唯一性就没了。
所以在分布式系统里,UUIDv4 配合高质量的随机源(如 SecureRandom)已经很可靠,大部分场景可以放心用。如果对有序性有要求,更推荐 v7,数据库索引更友好。
