# UUID版本指南

这篇文章将介绍UUIDV1V5的差异以及该如何选择正确的版本。

# UUID 是什么

通用唯一识别码(全称:Universally Unique Identifier,简称:UUID)是用来在系统中唯一标识某条信息的128位标识码。

根据标准(RFC 4122 ),UUID的生成不依赖外部服务, 且具有唯一性(注:重复概率几乎为零)。

UUID16进制的32个数字组成,故理论上总量为16<sup>32</sup>,即使每纳秒生成一万亿个,也好耗尽壹佰亿年才能强所有UUID用完。

# UUID 的结构

UUID包含3216进制数字,分为5段,5段长度分别为844412,中间使用连字符连接。

例如:xxxxxxxx-xxxx-Mxxx-xxxx-xxxxxxxxxxxx

其中M表示 UUID的版本,从 uuid生成 可以看出,M位置的值和版本是一致的。

各段含义如下:

名称 长度 (字节) 长度(16进制数字码长) 说明
time_low 4 8 整数:低位 32 bits 时间
time_mid 2 4 整数:中间位 16 bits 时间
time_hi_and_version 2 4 最高有效位中的 4 bits“版本”,后面是高 12 bits 的时间
clock_seq_hi_and_res clock_seq_low 2 4 最高有效位为 1-3 bits“变体”,后跟13-15 bits 时钟序列
node 6 12 48 bits 节点 ID

# V1

UUID-V1 是通过使用主机 MAC 地址和当前日期和时间的组合生成的。除此之外,它还引入了另一个随机组件,以确保其唯一性。 但是如果使用同一台机器、同时时间生成UUID,会有很小的几率重复。

UUID-v1存在的问题是:

  1. 存在重复几率
  2. 根据ID能推算出创建时的相对时间
  3. 根据ID能推算出创建的机器唯一标识

# V2

UUID-v2V1很类似,是根据标识符(通常是组或用户ID)、时间和节点ID生成,不过区别在于V2V1中的部分时间信息换成了主机名, 故应用具有局限性(有隐私风险),未大规模使用。

# V3

UUID-v3 通过散列(MD5)名字空间(namespace)标识符和名称生成。和V1V2不同,V3不依赖与机器信息和时间信息, 但是V3要求输入命名空间+名称,命名空间本身也是一个UUID,用来标识应用环境,名称通常是用户账号、用户名之类的内容,通过命名空间+名称+三列算法算出UUID

# V4

UUID-v4 组成 UUID v4 的位是随机生成的,没有固有逻辑(除了第三段首个数字,该数字标识版本号),不包含命名空间、设备信息、时间信息。 故,UUID-v4最容易理解、应用也最为广泛。

java 生成 UUID-V4

  String uuid = UUID.randomUUID();

js 生成 UUID-v4 参考https://www.npmjs.com/package/uuidv4

# V5

UUID-v5V3类似,区别在于散列算法,使用了sha1散列算法。

注:相同的命名空间、名称,将映射到同一UUID,且推荐使用V5而非V3

具体实现可参考 UUID5

# 如何选择

V4是随机ID,其他都不是,故:正常情况下直接选择UUID-V4就可以了,如果需要根据ID给出创建时间、机器信息等内容的话, 选择V1比较合适,如果还有特殊情况,需要根据已有信息衍生出新的ID,可以使用V5

# 其他

uuid 在线生成链接

最后更新: Fri, 05 Apr 2024 04:58:10 GMT

0 评论

加载中...
访问量:-