UUID 命名空间从何而来?

47

UUID规范定义了四个预定义的命名空间,并将其描述为“具有潜在兴趣”,意味着,“如果其他人在此命名空间中生成UUID,则可以验证它们”:

  • DNS: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
  • URL: 6ba7b811-9dad-11d1-80b4-00c04fd430c8
  • ISO OID: 6ba7b812-9dad-11d1-80b4-00c04fd430c8
  • X.500 DN: 6ba7b814-9dad-11d1-80b4-00c04fd430c8

这些命名空间从何而来?

具体来说;

  • 如果我正在生成自己的命名空间UUID,我需要避免什么特定的内容吗?
  • 我知道UUID空间有多大,但这对冲突有何影响吗?
  • 为什么他们选择第四个八位字节作为UUID“版本号”的一种增量方式?
  • 我的问题是否意味着我对UUID存在某些基本的误解?

1
rfc4122中写道:“在为名称分配机制或约定及确保其在其名称空间内的唯一性方面使用的机制或约定不在本规范的范围之内。”- 但我不知道在哪里指定了这个。 - Franziskus Karsunke
2个回答

48
首先,明确一点,本讨论仅限于版本3和5的UUID。根据我的(轶闻)经验,版本4(随机)UUID最常用。 4122的命名空间UUID生成算法含糊地开始:
分配一个UUID作为“名称空间ID”
没有其他关于“名称空间ID”分配的提及,我和python都没有找到除RFC 4122中列出的四个标准空间以外的任何标准化的空间。
因此,对于您的第一个问题的答案是:
如果我要生成自己的命名空间UUID,我需要避免特定的任何内容吗?
你只需要避免这四个标准命名空间。

下一个问题是:

  • 我知道UUID空间有多大,但这对碰撞有什么影响吗?

有两个部分:

  1. 您的命名空间内的UUID会发生碰撞吗?摘自4122:

    从[your]命名空间中生成的UUID应该不同(极有可能)。

  2. 您的命名空间UUID会与其他命名空间发生碰撞吗?我找不到直接的答案,因为没有“命名空间ID”分配的标准,但section 4.1.1中的论点似乎相关:

    与此处未定义的其他变体进行任何形式的互操作性都不能保证,在实践中也不太可能成为问题。


这是一个谜。幸运的是,我们有UUID规范,所以我们可以从中获取一些见解。
请注意,所有情况下(0索引)的第8个八位组都以8开头,因此我们正在处理RFC 4122变体 UUID。现在检查第6个八位组的版本:1,我们正在处理版本1基于时间的UUID。
这个答案提供了一个方便的算法,用于从版本1 UUID中提取Python日期时间。应用该算法可得到1998年2月4日的时间。我还没有找到这个日期的含义。增加第3个八位组会将最小的可编码时间间隔(100纳秒)添加到日期中。
  • 我的问题是否暗示了我对 UUID 存在基本的误解?

不是的。由于随机 UUID 非常容易生成,因此很少讨论 UUID 命名空间。


8
太好了,特别是对这些命名空间的解构。看起来,1998年2月4日对应于UUID草案规范的日期- http://tools.ietf.org/html/draft-leach-uuids-guids-01 - Gareth
2
命名空间UUID是版本1。我相信你正确计算了日期。最后的12个十六进制字符是主机ID,通常从生成UUID的机器的MAC地址计算得出。使用在线OUI数据库,我们可以知道“00c04f”表示它是在Dell盒子上生成的。就我个人而言,我想知道“6ba7b813”发生了什么... :) - Chris Cogdon
@ChrisCogdon 关于“6ba7b813”发生了什么-也许规范撰写者患有十三恐惧症,或者他们担心我们会患上这种症状。 :) - Jesse Chisholm

4
如果我生成自己的命名空间UUID,我需要避免什么吗?
不需要。您的命名空间UUID可以是以任何正常方式生成的UUID。例如,您可能希望生成版本1或版本4 UUID作为您的命名空间UUID。在Linux或OS X上,可以使用uuidgen程序完成此操作。您还可以轻松地在线生成版本1或版本4 UUID。

2
或者,使用标准命名空间UUID之一(RFC 4122的附录C)和您的命名空间字符串生成your根命名空间UUID。 然后使用该命名空间及其内部名称生成每个所需的UUID。 例如,类似于:root = uuid(uuid.URL,“www.example.com”); page1 = uuid(root,“page1.html”); page2 = uuid(root,“page2.html”); // 是的,我假设uuid的ctor知道该怎么做。 :) - Jesse Chisholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接