我正在创建一个自定义算法来将信息嵌入到timeUUID中。在学习RFC 4122时。在规范中,版本 1 UUID 具有以下结构:
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 | time_hi_and_version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
我发现时间戳的下半部分(最右边的 32 位)位于 ID 前面,使其成为排序 UUID 时最相关的部分。我不明白的是,在对 UUID 进行排序时,该规范是如何工作的,排序将遵循创建顺序。
为了说明这个问题,请在此处找到两个示例,其中时间戳 t1 > t2 但创建的具有该时间戳的 UUID 将按相反的顺序排列。
t1 = 137601405637595834 // 0x1e8dbbfd79f92ba
t2 = 3617559227 // 0xd79f92bb
转化为以下部分
t1_low: Uint = 3617559226 // 0xd79f92ba
t1_mid: Ushort = 56255 // 0xdbbf
t1_hi: Ushort = 1e8 // 0x1e8
t2_low: Uint = 3617559226 // 0xd79f92bb
t2_mid: Ushort = 0 // 0x0
t2_hi: Ushort = 0 // 0x0
由于在这种情况下,最低有效字节与顺序无关,为了简化起见,我将忽略它。
使用这些时间戳生成的 UUID 是
UUID1 = d79f92ba-dbbf-11e8-8808-000000000002
UUID2 = d79f92bb-0000-1000-a68b-000000000004
显然 UUID1 < UUID2 即使它的时间戳是相反的顺序。
我的分析有什么问题?