Guide to UUID in Java
by baeldung
最近没怎么写代码,简单复习一下Java的UUID知识点吧,原文来自于baeldung,这个网站有很多Java语言的技巧,经过我长期观察,内容相对各种中文博客是严谨靠谱很多的,可以日常看看,巩固知识。
1.概览
Java中的UUID是一个128bit的值,通常用十六进制数字加”-“字符表示为长度36位的字符串,例如123e4567-e89b-12d3-a456-556642440000
,因为128bit是16字节,而一个字节可以表示为2个十六进制字符,”-“符号纯粹是为了可读性添加的,不实际存储于数据中。
UUID广泛用于表示全局唯一值的场景,但是并不是完全不会重复,只是重复的概率较小,在数据量较大和多服务器环境中要注意UUID可能出现重复。
2.Java的UUID类
Java的UUID类有构造函数,具体我就不列了,因为不常用,UUID提供了三个便利的静态方法来生成UUID,最常用的是UUID uuid = UUID.randomUUID();
,这个方法会生成一个version 4
标准的UUID。
3.结构
1 | 123e4567-e89b-42d3-a456-556642440000 |
3.1 UUID变体
结构里面的A位置(第9个字节)的前三位表明了变体的种类,示例里面的小写a (=10xx)
说明是variant 2。
1 | MSB1 MSB2 MSB3 |
3.2 UUID版本
结构里面的B位置(第7个字节)的前四位表示版本号,这里版本号是4
。对于当前variant 2的UUID来说,有5个不同的版本,
java实现了v3和v4版本,并且提供一个构造函数可以自定义生成任意规则的UUID。
Time Based (UUIDv1)
基于当前设备的时间戳和MAC地址
DCE Security (UUIDv2)
也是基于时间戳和MAC地址,但是RFC 4122中没有描述详细实现规则
Name Based (UUIDv3 and UUIDv5) 基于命名空间和名称的hash生成,v3和v5的区别在于hash算法不同, v3使用MD5(128 bits)而v5使用SHA-1(160 bits)。
Random (UUIDv4) 基于随机数生成,Java实现使用
SecureRandom
生成一个不可预测的随机数种子,以减少重复的概率。
Guide to UUID in Java