个性化阅读
专注于IT技术分析

Java 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

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 2

在上图中, “ 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

赞(0)
未经允许不得转载:srcmini » Java UUID介绍和用法

评论 抢沙发

评论前必须登录!