跳到主要内容

5.1. UUID Version 1

5.1. UUID Version 1

UUIDv1 是一种基于时间的 UUID, 具有 60 位时间戳. 该时间戳以协调世界时 (Coordinated Universal Time, UTC) 表示, 计数单位为自 1582 年 10 月 15 日 00:00:00.00 (基督教历法的 Gregorian reform 日期) 以来的 100 纳秒间隔数.

UUIDv1 还具有 clock sequence 字段, 用于帮助避免在时钟被向后设置或 Node ID 发生变化时可能产生的重复.

node 字段由 IEEE 802 MAC 地址组成, 通常是主机地址, 或者是按 Sections 6.9 和 6.10 随机派生的值.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | ver | time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| clock_seq | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 6: UUIDv1 字段和位布局

字段定义:

time_low: 60 位起始时间戳的最低有效 32 位. 占据第 0 到 31 位 (八位组 0-3).

time_mid: 60 位起始时间戳的中间 16 位. 占据第 32 到 47 位 (八位组 4-5).

ver: Section 4.2 定义的 4 位 version 字段, 设置为 0b0001 (1). 占据第 6 个八位组的第 48 到 51 位.

time_high: 来自 60 位起始时间戳的最低有效 12 位. 占据第 52 到 63 位 (八位组 6-7).

var: Section 4.1 定义的 2 位 variant 字段, 设置为 0b10. 占据第 8 个八位组的第 64 和 65 位.

clock_seq: 包含 clock sequence 的 14 位. 占据第 66 到 79 位 (八位组 8-9).

node: 48 位空间唯一标识符. 占据第 80 到 127 位 (八位组 10-15).

对于没有 UTC 但有本地时间可用的系统, 只要在整个系统中一致使用, 就可以用本地时间代替 UTC. 但是, 不建议这样做, 因为从本地时间生成 UTC 只需要一个时区偏移量.

如果时钟被向后设置, 或者可能曾被向后设置 (例如系统断电期间), 并且 UUID 生成器无法确定没有生成过时间戳大于时钟所设回值的 UUID, 则 clock sequence MUST 改变. 如果已知 clock sequence 的前一个值, 则 MAY 递增它; 否则, 它 SHOULD 设置为随机值或高质量伪随机值.

类似地, 如果 Node ID 发生变化 (例如因为网卡在机器之间移动), 将 clock sequence 设置为随机数可以最大限度降低由于机器时钟设置存在轻微差异而导致重复的概率. 如果已知与改变后的 Node ID 关联的 clock sequence 值, 则 clock sequence MAY 递增, 但这种情况不太可能发生.

clock sequence MUST 最初 (即在系统生命周期内一次性) 初始化为随机数, 以最大限度减少跨系统相关性. 这可为可能快速从一个系统移动或切换到另一个系统的 Node IDs 提供最大保护.