Java UUID

17 Mar 2025 | 4 分钟阅读

什么是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 的表示使用十六进制数字。

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

Java UUID
名称长度 (十六进制数字)长度 (字节)内容
time_low84时间的低 32 位
time_mid42时间的中间 16 位
time_hi and_version424 位版本号在 MSB,后跟时间的最高 12 位
clock_seq_hi_and_res clock_seq_low421-3 位变体在最高有效位,后跟 13-15 位时钟序列
node12648 位节点 ID

Java UUID 用途

它用于创建以下内容

  • Web 应用程序的会话 ID
  • 交易 ID
  • 随机文件名
  • 数据库表的主键

Leach-Salz 变体:变体字段包含标识 UUID 布局的值。变体 2 (Leach-Salz) UUID 的表示如下:

  • 0xFFFFFFFF00000000 (表示 time_low)
  • 0x0000000FFFF0000 (表示 time_mid)
  • 0x0000000000000FF (表示 time_hi)
  • 0x00000000000F000 (版本)

上面定义的位布局仅对变体值为 2(表示 Leach-Salz 变体)的 UUID 有效。

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:Leach-Salz
  • 6:保留用于 Microsoft 向后兼容
  • 7:保留供将来定义。
Java UUID 2

在上面的图中,“V”表示 UUID 版本,“R” (1-3) 表示 UUID 变体。

Java UUID 构造函数

我们可以使用构造函数生成不同类型的 UUID。构造函数的语法是:

mostSigBits 参数用于 UUID 的 MSB (64 位),leastSigBits 成为 UUID 的 LSB (64 位)。


UUID 类的方法

UUID randomUUID() 方法

randomUUID() 方法随机生成 UUID。每次运行程序时,它都会生成一个新的 UUID。该方法的签名是:

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

示例

以下示例生成一个随机 UUID。

输出

c6a8669e-ee95-4c42-9ef6-4a9b61380164

UUID version() 方法

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

示例

输出

UUID version is: 1
UUID version is: 3

UUID variant() 方法

此 UUID 关联的变体号。它描述了 UUID 的布局。该方法返回 UUID 的变体号。该方法的签名是:

示例

输出

UUID variant is: 2
UUID variant is: 7

UUID node() 方法

node() 方法返回与 UUID 关联的节点值。它是一个 48 位节点值。它由此 UUID 的字段构成。它包含机器的 IEEE 802 地址(MAC 地址)。如果 UUID 不是版本 1 UUID,则会引发 UnsupportedOperationException

该方法的签名是:

示例

输出

Node value: 55075465998336

下一主题