UUID

HTTP 请求

加密/解密

Common 常用模块

Reflection 反射

Input/Output 输入/输出

UUIDv7 教程

本教程提供了 UUIDv7 类的概述,该类是 lightweight-component/aj-util 库的一部分。UUIDv7 实现了 UUID 版本 7 规范,相比传统的随机 UUID,它提供了按时间排序的 UUID,具有改进的特性。

简介

UUIDv7 类实现了在提议的 UUID 规范中定义的 UUID 版本 7 格式。UUIDv7 旨在按时间排序,同时保持 UUID 的唯一性保证。它在最高有效位中嵌入了毫秒精度的 Unix 时间戳,使 UUID 可以按创建时间排序。

UUIDv7 通过以下方式解决了传统随机 UUID(版本 4)的几个限制:

  1. 使 UUID 按时间排序,以便更好地进行数据库索引
  2. 保持与 UUID 标准的兼容性
  3. 比 UUID 版本 1 提供更有效的时间表示

方法

1. randomUUID()

使用当前时间戳和安全随机值生成新的 UUIDv7。

示例:

UUID uuid = UUIDv7.randomUUID();
System.out.println(uuid); // 例如:"017f22e2-79b0-7cc3-98c4-dc0c0c07398f"

UUIDv7 结构

UUIDv7 格式遵循以下结构:

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           unix_ts_ms                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          unix_ts_ms           |  ver  |       rand_a          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

其中:

实现细节

UUIDv7 类生成具有以下特征的 UUID:

  1. 前 48 位包含毫秒级 Unix 时间戳
  2. 版本位(第 48-51 位)设置为 0111(7)
  3. 变体位(第 64-65 位)设置为 10(RFC 4122 变体)
  4. 剩余位用加密安全的随机值填充

此实现使用 SecureRandom 生成 UUID 的随机部分,确保高度的唯一性和不可预测性。

使用场景

UUIDv7 特别适用于:

  1. 数据库主键:按时间排序的特性使其成为高效的索引
  2. 分布式系统:它们可以独立生成,同时保持大致的时间顺序
  3. 日志和跟踪:嵌入的时间戳有助于按时间顺序分析
  4. 任何需要可排序唯一标识符的系统:创建顺序很重要的场景

与其他 UUID 版本的比较

结论

UUIDv7 类提供了按时间排序的 UUID 的现代实现,它保持与 UUID 标准的兼容性,同时为数据库系统和分布式应用程序提供改进的特性。通过以标准化方式嵌入时间戳,UUIDv7 实现了高效的排序和索引,同时保留了 UUID 预期的唯一性保证。