Java UUID的底层原理

UUID的几个核心特定:

全局时空唯一性
固定长度128比特,也就是16字节(1 byte = 8 bit)
分配速率极高,单机每秒可以生成超过1000万个UUID(实际上更高)

UUID是Universally Unique IDentifier的缩写,翻译为通用唯一标识符或者全局唯一标识符。UUID的长度为128比特,可以保证在空间和时间上的唯一性。

UUID本质是一个128比特的数字,这是一个位长巨大的数值,理论上来说,UUID的总数量为2^128个。这个数字大概可以这样估算:如果每纳秒产生1兆个不相同的UUID,需要花费超过100亿年才会用完所有的UUID。

UUID的变体与版本

UUID标准和算法定义的时候,为了考虑历史兼容性和未来的扩展,提供了多种变体和版本。接下来的变体和版本描述来源于维基百科中的Versions章节和RFC 4122中的Variant章节。

目前已知的变体如下:

变体0xx:Reserved, NCS backward compatibility,为向后兼容做预留的变体
变体10x:The IETF aka Leach-Salz variant (used by this class),称为Leach–Salz UUID或者IETF UUID,JDK中UUID目前正在使用的变体
变体110:Reserved, Microsoft Corporation backward compatibility,微软早期GUID预留变体
变体111:Reserved for future definition,将来扩展预留,目前还没被使用的变体

目前已知的版本如下:

0:空UUID(特殊版本0),用00000000-0000-0000-0000-000000000000表示,也就是所有的比特都是0
1:date-time and MAC address(版本1):基于时间和MAC地址的版本,通过计算当前时间戳、随机数和机器MAC地址得到。由于有MAC地址,这个可以保证其在全球的唯一性。但是使用了MAC地址,就会有MAC地址暴露问题。若是局域网,可以用IP地址代替
2:date-time and MAC address, DCE security version(版本2):分布式计算环境安全的UUID,算法和版本1基本一致,但会把时间戳的前4位置换为POSIX的UID或GID
3:namespace name-based MD5(版本3):通过计算名字和命名空间的MD5散列值得到。这个版本的UUID保证了:相同命名空间中不同名字生成的UUID的唯一性;不同命名空间中的UUID的唯一性;相同命名空间中相同名字的UUID重复生成是相同的
4:random(版本4):根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,还有一个特点就是预留了6比特存放变体和版本属性,所以随机生成的位一共有122个,总量为2^122,比其他变体的总量要偏少
5:namespace name-based SHA-1(版本5):和版本3类似,散列算法换成了SHA-1

其中, JDK中应用的变体是Leach-Salz,提供了namespace name-based MD5(版本3)和random(版本4)两个版本的UUID生成实现

UUID的格式

UUID串是有格式要求的,通常是36个字符(32个字符加上4个连字符):格式为8-4-4-4-12,其中有效部分未32个字符。被连字符连起来的各部分有各自的含义,如时间戳、版本号等。

详情见前面的参考文章。

Original: https://www.cnblogs.com/z-sm/p/14653484.html
Author: March On
Title: Java UUID的底层原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537421/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球