写点什么

Guide to UUID in Java

发布于: 2021 年 04 月 21 日
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.结构

123e4567-e89b-42d3-a456-556642440000xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxx
复制代码

3.1 UUID 变体

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


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


访问作者技术博客浏览更多文章


微信扫一扫关注公众号


发布于: 2021 年 04 月 21 日阅读数: 38
用户头像

吃货开发者的探索 2014.08.16 加入

金融科技架构师

评论

发布
暂无评论
Guide to UUID in Java