# UUID版本指南
这篇文章将介绍UUID从V1到V5的差异以及该如何选择正确的版本。
# UUID 是什么
通用唯一识别码(全称:Universally Unique Identifier,简称:UUID)是用来在系统中唯一标识某条信息的128位标识码。
根据标准(RFC 4122 ),UUID的生成不依赖外部服务,
且具有唯一性(注:重复概率几乎为零)。
UUID有16进制的32个数字组成,故理论上总量为16<sup>32</sup>,即使每纳秒生成一万亿个,也好耗尽壹佰亿年才能强所有UUID用完。
# UUID 的结构
UUID包含32个16进制数字,分为5段,5段长度分别为8、4、4、4、12,中间使用连字符连接。
例如: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存在的问题是:
- 存在重复几率
- 根据
ID能推算出创建时的相对时间 - 根据
ID能推算出创建的机器唯一标识
# V2
UUID-v2和V1很类似,是根据标识符(通常是组或用户ID)、时间和节点ID生成,不过区别在于V2将V1中的部分时间信息换成了主机名,
故应用具有局限性(有隐私风险),未大规模使用。
# V3
UUID-v3 通过散列(MD5)名字空间(namespace)标识符和名称生成。和V1、V2不同,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-v5 和V3类似,区别在于散列算法,使用了sha1散列算法。
注:相同的命名空间、名称,将映射到同一
UUID,且推荐使用V5而非V3
具体实现可参考 UUID5
# 如何选择
V4是随机ID,其他都不是,故:正常情况下直接选择UUID-V4就可以了,如果需要根据ID给出创建时间、机器信息等内容的话,
选择V1比较合适,如果还有特殊情况,需要根据已有信息衍生出新的ID,可以使用V5。
# 其他
← crontab nginx 缓存设置 →