0

我正在创建一个自定义算法来将信息嵌入到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 即使它的时间戳是相反的顺序。

我的分析有什么问题?

4

1 回答 1

0

UUIDv1 规范故意将最大的熵放在高位,这样键就不会按您的预期排序;相反,无论创建顺序如何,它们看似随机但大致均匀分布在整个数字范围内——就像 UUIDv3/v4/v5 一样。

如果您想要一个可排序的时间戳,请添加另一列;将 UUID 用作除不透明标识符之外的任何东西都会在以后咬你。

于 2018-11-03T21:06:28.437 回答