2024年6月14日发(作者:)

UUID简介及常见问题分析

1. UUID简介

UUID即通用唯一识别码 (Universally Unique Identifier),UUID 的目的是让分

布式系统中的所有元素,都能有唯一的辨识信息,而不需要透过中央控制端来做

辨识信息的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这

样的情况下,就不需考虑数据库建立时的名称重复问题。

2. UUID基本生成规则

UUID最重要的是要保证全局唯一性,在生成与使用时通常需要考虑以下几

个方面的因素:

 时间上不重复:同一台机器前后时间产生的UUID不重复;

 空间上不重复:同一时间两台机器上产生的UUID不重复;

 并发生成UUID不重复:同一台机器不同生成单元(进程或线程)生成

的UUID不重复,尤其是同一时间点生成的UUID;

 UUID长度定义:产生、存储、使用该套UUID的程序及数据库表设计保

证足够的长度,并建议预留空间以支持后续算法扩展;

 UUID数据类型:为保证算法可靠,多采用较长字符串方式存储UUID;

 UUID有效期:生成的UUID的有效期在整个系统中使用UUID的地方需

要统一。

常见UUID生成规则如下:

日期和时间标识 物理标识 随机序列

日期和时间标识:可取毫秒或微秒级的UTC时间;

物理标识:全局唯一的机器识别号,如果有网卡,从网卡MAC地址获得,

没有网卡以其他方式获得;

随机序列:使用重复概率很低的随机方式生成随机序列;

长度允许情况下也可以加入线程ID等信息进一步降低UUID重复可能性。

3. 常见问题分析

1) 定义的UUID长度和类型不统一

问题实例:产生、使用、存储该UUID的程序和数据库定义不一致,部分程

序定义为U64类型,而其他程序及数据库存储时使用的是S64类型,U64方式产

生的UUID存储到数据库时可能超出S64范围变为负数,其他程序再使用该UUID

时就可能出现问题。

2) 算法过于简单导致产生的UUID重复

问题实例:UUID生成算法采用MAC地址一部分(4字节)+4字节随机数,

由于随机算法不能保证唯一,导致同一台服务器上产生的UUID重复概率变大。

3) 算法精度不够导致产生的UUID重复

问题实例:UUID生成算法采用日期和时间标识+物理标识+增1序列,由于

日期和时间标识精度过低,只精确到秒,导致在1秒时间内产生很多UUID的情

况下会导致UUID重复。

4) UUID生成算法不支持多线程(或同一物理机上的多进程)

问题实例:UUID生成算法采用日期和时间标识+物理标识+增1序列,同一

时刻多线程(或同一物理机上的多进程)同时进行UUID生成时都将进行增1操

作,实现时没有考虑多线程情况,对标识增1序列的变量的增1操作没有加锁等

保护,可能导致UUID重复。

5) UUID有效期不一致导致的问题

问题实例:使用同一套UUID的多个程序,定义的有效期不一致,使用时可

能出现UUID有效期长短不一的情况,在上述UUID产生重复的情况下还可能将

正常使用的UUID有效期变更,使UUID提前失效等。