Guide to UUID in Java

Guide to UUID in Java

by baeldung

原文地址:https://www.baeldung.com/java-uuid

最近没怎么写代码,简单复习一下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
2
123e4567-e89b-42d3-a456-556642440000
xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxx

3.1 UUID变体

结构里面的A位置(第9个字节)的前三位表明了变体的种类,示例里面的小写a (=10xx)说明是variant 2。

1
2
3
4
5
MSB1    MSB2    MSB3
0 X X reserved (0)
1 0 X current variant (2)
1 1 0 reserved for Microsoft (6)
1 1 1 reserved for future (7)

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生成一个不可预测的随机数种子,以减少重复的概率。

微信扫一扫关注公众号

作者

Casey Wang

发布于

2021-01-17

更新于

2021-04-22

许可协议

评论