建议阅读内容
在阅读此篇文章之前,建议先了解 UUIDv1 的构成、UUIDv4 的 API 以及掌握位运算。
了解 UUIDv1 的构成可以参考Go 语言 UUID 库 google/uuid 源码解析:UUID version1 的实现 或 RFC 9562。
了解 UUIDv4 的 API 可以看Go 语言 UUID 库 google/uuid 源码解析:UUID version4 的实现。
位运算可以参考详解位运算(&、|、、&、>>、<<)。
相较于 UUIDv1,UUIDv7 的改进
UUIDv7 是 UUIDv1 的优化版本,其优化有三点:
-
使用自 1970 年 1 月 1 日午夜(Unix 纪元时间戳源)以来的毫秒数代替自 1582 年 10 月 15 日以来的 100 纳秒数作为时间戳。
-
UUIDv7 在序列中保持时间戳的顺序(UUIDv1 会对时间戳进行重排),这意味着生成的 UUID 会按时间顺序排列。优化在数据库中作为索引时的性能表现。
-
随机生成序列中的 74 位(UUID 总共 128 位),增加熵特性,减少逆向推导的可能性(UUIDv1 包含 MAC 地址)。
UUIDv7 的结构介绍
UUIDv7 主要由三部分组成(以下陈述并没有按顺序排列):
-
在最高的 48 位分配的Unix时间戳。
-
6 位标志位(2 位变体标识,4位版本标识)。
-
以及随机填充的74位。
UUIDv7 具体的字段和位具体布局如下:
(表格顶部的两行数字用于表示位数,00,01,…,10,11,…,20,21,…,30,31)
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 (12 b