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提前失效等。
发布评论