UUID是什么?
UUID(Universally Unique Identifier,通用唯一标识符)是一种128位的标识符标准,定义于RFC 4122。UUID的核心目标是:在不依赖中央协调机构的情况下,生成全局唯一的标识符。这意味着你可以在任何时间、任何地点生成UUID,而不用担心与其他人生成的UUID冲突。UUID的标准表示形式为8-4-4-4-12的32个十六进制字符,例如:550e8400-e29b-41d4-a716-446655440000。
UUID在分布式系统中扮演着关键角色——当你需要在多个数据库、多个服务之间生成唯一ID时,UUID是比自增整数更安全的选择。Windows系统中UUID被称为GUID(Globally Unique Identifier),两者本质相同。
UUID的5个版本
RFC 4122定义了5个UUID版本,每个版本使用不同的生成策略:
- V1(基于时间):使用MAC地址和时间戳生成,具有时序性但暴露硬件信息
- V2(DCE安全):基于V1,加入POSIX UID/GID,实际很少使用
- V3(MD5命名空间):基于命名空间和名称的MD5哈希,确定性生成
- V4(随机):使用随机数生成,最常用的版本
- V5(SHA-1命名空间):基于命名空间和名称的SHA-1哈希,V3的安全替代
此外,2024年发布的RFC 9562新增了V6、V7、V8三个版本,其中V7最受关注。
V1:时间戳+MAC地址
V1 UUID由以下部分组成:当前时间戳(60位,100纳秒精度)、时钟序列(14位,防止时钟回拨冲突)、节点ID(48位,通常是MAC地址)。V1的优势是具有自然的时序性,可以按生成时间排序。但它的缺点也很明显:MAC地址暴露了硬件信息,存在隐私风险;不同机器的MAC地址不同,可能导致分布式系统中的热点问题。
V1 UUID的时间戳从1582年10月15日开始计算(Gregorian日历改革日),这是一个历史遗留的设计选择。时间戳的高位放在UUID的前部,因此V1 UUID大致可以按字典序排序。
V4:纯随机方案
V4 UUID是最广泛使用的版本,6位固定(版本号和变体位),其余122位全部随机。这意味着V4 UUID共有2的122次方种可能,冲突概率极低——生成10亿个UUID后冲突概率仍不到十亿分之一。V4的生成速度极快,不依赖任何外部状态,是最简单的UUID版本。
V4的主要缺点是完全无序,作为数据库主键时会导致B+树索引频繁分裂和页分裂,写入性能较差。在高并发写入场景下,随机主键的性能可能比有序主键低30%-50%。
V7:有序UUID的未来
V7 UUID是2024年新标准中最受期待的版本。它将前48位设为毫秒级Unix时间戳,后74位随机,实现了时间有序性和唯一性的平衡。V7的核心优势:作为数据库主键时写入性能接近自增ID(索引友好);可以从前48位提取生成时间,无需额外存储时间字段;按字典序排列即按时间排列,方便范围查询和排序。
V7的生成规则:前48位为毫秒级时间戳(与Unix时间戳兼容);4位版本号固定为0111(7);12位随机子毫秒序列(确保同一毫秒内的有序性);2位变体位固定为10;62位随机位。这种设计使得V7 UUID在保持全局唯一性的同时,具备了V1的时序性和V4的简洁性。
UUID vs 雪花算法 vs ULID
三种分布式ID方案的对比:UUID V4完全随机,无序但最简单;雪花算法(Snowflake)有序、高性能但依赖机器ID分配;ULID与V7类似,时间戳+随机,但编码方式不同(Crockford's Base32)。对于新项目,推荐优先考虑UUID V7——它是开放标准,不需要中央协调,且兼具有序性。对于需要更高性能的场景,雪花算法仍然是优秀的选择。
工具推荐
使用我们的在线UUID生成器,支持一键批量生成V1/V4/V7等版本的UUID,支持大小写切换和格式选择,帮助你快速获取唯一标识符。