什么是 UUID 解码?
UUID 解码 是分析 UUID 以提取有关其以下内容的过程:
- Version:基于位置 48-51 的 4 位判断属于哪个 UUID 版本(1-8)
- Variant:基于位 64-65 判断属于哪个 UUID 变体(通常为 RFC 4122)
- Components:基于版本提取时间戳、节点 ID 或其他数据
- 生成时间:对于基于时间的 UUID(v1、v6、v7)
Example: 123e4567-e89b-12d3-a456-426614174000 是具有时间戳的版本 1 UUID,时间戳为 2228-06-25T20:01:28.545Z 以 JavaScript 毫秒精度显示时。
UUID 结构概述
| Format | Description |
|---|---|
| 8-4-4-4-12 | 32 个十六进制位,用连字符分组 |
| 版本位 | 位 48-51(第 13 个字符) |
| 变体位 | 位 64-65(第 17 位十六进制) |
版本号出现在第三组的第一个十六进制数字中(例如, 123e4567-e89b-12d3-a456-426614174000 用于版本 1)。
按 UUID 版本解码
| Version | 可以解码的内容 |
|---|---|
| UUID v1 |
|
| UUID v3/v5 |
|
| UUID v4 |
|
| UUID v6 |
|
| UUID v7 |
|
从 UUID 提取时间戳
| UUID 类型 | 时间提取方法 | Epoch |
|---|---|---|
| UUID v1 | 将位 0-31、32-47 和 48-59 合并,按需重新排序时间戳组件 | 1582 年 10 月 15 日 |
| UUID v6 | 将位 0-47 与位 52-63 合并;位 48-51 为版本位,应排除 | 1582 年 10 月 15 日 |
| UUID v7 | 提取位 0-47(Unix 毫秒) | 1970 年 1 月 1 日 |
UUID 验证规则
- 格式检查:使用连字符的 8-4-4-4-12 十六进制数字格式
- 版本检查:第 13 个字符必须是 1-8
- 变体检查:第 17 个字符必须是 8、9、A 或 B(对于 RFC 4122)
用于基本 UUID 验证的正则表达式:
^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$UUID v7 时间戳示例
017f22e2-79b0-7cc3-98c4-dc0c0c07398f 是 RFC 9562 的 UUIDv7 测试向量。其前 48 位为 Unix 毫秒,解码为 2022-02-22T19:22:22.000Z, 1645557742000 毫秒,或 1645557742 seconds.
生成一个新的 UUID v7,或继续使用 Unix 时间戳转换器。这些链接不包含您输入的 UUID。
实际应用
- 取证分析:确定 ID 的创建时间
- Debugging:通过 ID 时间戳追踪系统行为
- Auditing:验证时间顺序完整性
- 格式检查:检测格式错误的 ID;一个有效的 UUID 并不证明其真实性
- 数据恢复:重建时间关系
- 系统迁移:理解遗留 UUID 实现细节
MAC 地址提取(v1/v6)
对于 UUID v1 和 v6,如果在生成时未随机化,通常可以提取节点标识符(MAC 地址):
- 从 UUID 中提取最后 12 个十六进制位(48 位)
- 按 XX:XX:XX:XX:XX:XX 格式加冒号
- 通过检查多播位来判断 MAC 地址是真实还是随机的
如果第一个字节的 0x01 位被置位,则很可能是随机的节点 ID,而非实际的 MAC 地址。
常见问题
我能确定 UUID v4 的确切创建时间吗?
不能。UUID v4 完全是随机的,不包含时间戳信息。无法从 UUID v4 值确定创建时间。
基于时间的 UUID 中的时间戳有多准确?
UUID v1/v6 的时间戳具有 100 纳秒精度。UUID v7 具有毫秒精度。然而,实际系统时钟的精度可能有所不同。
我可以在 UUID 版本之间互相转换吗?
不能直接在版本之间转换以保留相同的标识值。不同版本在结构上根本不同。
我能识别出生成 UUID v1 的计算机吗?
如果节点 ID 未随机化,UUID v1 可能包含生成系统的 MAC 地址。但是,许多现代实现为隐私起见对其进行了随机化。
如何判断 UUID 是否有效?
检查格式(8-4-4-4-12 十六进制位),验证版本位(第 13 个字符为 1-8),并确认变体位(RFC 4122 UUID 的第 17 个字符为 8、9、A 或 B)。