Java UUID介绍和用法

本文概述

  • 什么是UUID?
  • Java UUID用法
  • UUID变体
  • Java UUID构造函数
  • UUID类的方法
什么是UUID? UUID代表通用唯一标识符。 UUID由开放软件基金会(OSF)标准化。它是分布式计算环境(DCE)的一部分。 UUID是36个字符长的唯一编号。它也被称为全局唯一标识符(GUID)。
Java UUID类
  • UUID是代表不可变的通用唯一标识符(UUID)的类。
  • UUID表示一个128位长的值, 对于所有实际用途而言都是唯一的。它用于识别计算机系统中的信息。
  • UUID类属于java.util包。
  • UUID类实现Serializable和Comparable接口, 并扩展Object类。
  • 这些全局标识符存在许多变体。
  • UUID类的方法用于操纵Leach-Salz变体。
Java UUID表示形式
UUID的表示使用十六进制数字。
237e9877-e79b-12d4-a765-321741963000

Java UUID由十六进制数字和四个连字符(-)组成。它是36个字符长的唯一数字, 包括四个连字符。 UUID可以为nil, 其中所有位均设置为零。
Java UUID介绍和用法

文章图片
Name Length (Hex Digits) Length (bytes) 内容
time_low 8 4 时间的低32位
time_mid 4 2 时间的中间16位
time_hi and_version 4 2 MSB中的4位版本, 后面是时间的高12位
clock_seq_hi_and_res clock_seq_low 4 2 最高有效位为1-3位, 随后为13-15位时钟序列
node 12 6 48位节点ID
Java UUID用法 它用于创建以下内容:
  • Web应用程序的会话ID
  • 交易编号
  • 随机文件名
  • 数据库表的主键
Leach-Salz变体:变体字段包含一个值, 用于标识UUID的布局。变体2(Leach-Salz)UUID的表示如下:
  • 0xFFFFFFFF00000000(表示time_low)
  • 0X0000000FFFF0000(表示time_mid)
  • 0x0000000000000FF(表示time_hi)
  • 0x00000000000F000(版本)
上面定义的位布局仅对UUID有效, 且UUID的变体值为2, 表示Leach-Salz变体。
UUID的类型
有四种类型的UUID:
  • 基于时间的UUID(版本1)
  • DCE安全性UUID(版本2)
  • 基于名称的UUID(版本3和5)
  • 随机生成的UUID(版本4)
版本3和5
【Java UUID介绍和用法】UUID版本3和5使用名称空间和名称的哈希值生成UUID。名称空间标识符是UUID, 例如域名系统(DNS), URL和OID(对象标识符)等。UUID版本3和UUID版本5之间的区别在于哈希算法。
版本3使用MD5(128位)算法, 而版本5使用SHA-1(160位)算法。我们将结果哈希值修整为128位, 然后将版本替换为4位, 将变体替换为2位。 Java不提供版本5的实现。
版本4
UUID版本4的实现使用随机数作为源。它使用不可预测的值作为种子来生成随机数以减少冲突的机会。
UUID变体 最常用的变体是2(Leach-Salz)。有以下几种类型的变体:
  • 0:保留用于NCS向后兼容
  • 2:浸盐
  • 6:保留用于Microsoft向后兼容
  • 7:保留以供将来定义。
Java UUID介绍和用法

文章图片
在上图中, “ V”表示UUID版本, “ R”(1-3)表示UUID变体。
Java UUID构造函数 我们可以使用构造函数生成不同类型的UUID。构造函数的语法为:
UUID = new UUID (long mostSigBits, long leastSigBits);

参数mostSigBits用于UUID的MSB(64位), 而minimumSigBits变为UUID的LSB(64位)。
UUID类的方法 UUID ramdomUUID()方法
randomUUID()方法随机生成UUID。每当我们运行该程序时, 它都会生成一个新的UUID。该方法的签名是:
public static UUID randomUUID()

该方法返回随机生成的UUID。

以下示例生成一个随机UUID。
import java.util.UUID; public class UUIDExample { public static void main(String[] args) { UUID uuid=UUID.randomUUID(); //Generates random UUID System.out.println(uuid); } }

输出量
c6a8669e-ee95-4c42-9ef6-4a9b61380164

UUID version()方法
与此UUID关联的版本。版本号描述了此UUID的生成方式。该方法返回UUID的版本号。该方法的签名是:
public int version()


import java.util.UUID; class UUIDVersionExample { public static void main(String arg[]) throws UnsupportedOperationException { //returns a UUID with specified value UUID uuid=UUID.fromString("c81d4e2e-bcf2-11e6-869b-7df92533d2db"); UUID uuid1=UUID.fromString("5289df73-7df5-3326-bcdd-22597afb1fac"); System.out.println("UUID version is: "+uuid.version()); //invoking version method System.out.println("UUID version is: "+uuid1.version()); } }

输出量
UUID version is: 1 UUID version is: 3

UUID variant()方法
与此UUID关联的变体编号。它描述了UUID的布局。该方法返回UUID的变体编号。该方法的签名是:
public int variant()


import java.util.UUID; class UUIDvariantExample { public static void main(String arg[]) throws UnsupportedOperationException { UUID uuid=UUID.fromString("c81d4e2e-bcf2-11e6-869b-7df92533d2db"); UUID uuid1=UUID.fromString("5289df73-7df5-3326-fcdd-22597afb1fac"); System.out.println("UUID variant is: "+uuid.variant()); //returns variant number System.out.println("UUID variant is: "+uuid1.variant()); } }

输出量
UUID variant is: 2 UUID variant is: 7

UUID node()方法
node()方法返回与UUID关联的节点值。它是一个48位的节点值。它是根据此UUID的字段构造的。它保存机器的IEEE 802地址(MAC地址)。如果UUID不是版本1 UUID, 则抛出UnsupportedOperationException。
该方法的签名是:
public long node()


import java.util.UUID; class UUIDnodeExample { public static void main(String arg[]) { //returns a UUID with specified value UUID uuid = UUID.fromString("237e9877-e79b-12d4-a765-321741963000"); System.out.println("Node value: "+ uuid.node()); //returns node value } }

输出量
Node value: 55075465998336

    推荐阅读