2011-10-11 118 views
38

UUID specification定义了4名,它描述为“潜在的有趣”预定义的命名空间 - 除其他事项外之意,“如果其他人已经生成的UUID这个命名空间中,你可以验证他们”:UUID名称空间来自哪里?

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

这些是从哪里来的?

具体而言;

  • 如果我正在生成我自己的命名空间UUID,我是否需要特别避免任何事情?
  • 我知道UUID空间有多大,但是这对碰撞有什么影响吗?
  • 他们为什么选择第4个八位字节作为UUID的一个版本号增加?
  • 我的问题是否意味着我错过了有关UUID的基本知识?
+1

rfc4122说:“ 用于分配名称和确保其名称空间内的唯一性的机制或约定超出了本规范 的范围。在4.3 ^^但我不知道它在哪里指定。 –

回答

41

首先,清楚的是,整个讨论仅限于版本3 & 5个UUID。在我的(轶事)经验中,版本4(随机)UUID是最常用的。

4122的命名空间的UUID生成算法含糊开始:

分配一个UUID为‘名称空间ID’

有的‘名称空间ID’没有其他提及使用分配,并且我也没有找到任何超出RFC 4122中列出的四个标准化空间。

因此,您的第一个问题的答案为

  • 如果我生成自己的名称空间UUID,是否需要避免特别的事情?

您只需要避开四个标准名称空间。


下一个问题,

  • 我知道的UUID空间有多大,但这对任何碰撞寓意?

主要有两个部分:

  1. 将在您的命名空间中的UUID发生冲突?从4122逐字:

    从[your]命名空间中的两个不同名称生成的UUID应该是不同的(具有很高的概率)。

  2. 您的名称空间UUID是否会与其他名称空间相冲突?我找不到一个直接的答案,因为有一个为“名称空间ID”分配没有标准,但在section 4.1.1的说法似乎相关:

    互操作性,以任何形式,用比这里所定义的一个 其他变体并不保证,并且不太可能成为 练习中的问题。


  • 他们为什么选择了第四个八位增加作为一种UUID '版本号' 的?

这是一个有点神秘的地方。幸运的是,我们有UUID的规范,所以我们可以挖掘他们的一些见解。

请注意,(0-索引)第8个八位字节在所有情况下始于8,所以我们正在处理RFC 4122变体 UUID。唷。

现在检查版本的第8个字节:1,我们正在处理版本1基于时间的 UUID。

这个answer有一个方便的算法,用于从版本1的UUID中提取Python日期时间。应用算法产生时间1998年2月4日。在这个日期我还没有找到意义。递增第3个字节会在日期中添加最小的可编码时间间隔(100ns)。


  • 做我的问题,意味着我失去了一些东西约UUID的根本?

没有。关于UUID名称空间的讨论很少,因为随机UUID非常容易。

+7

这很棒,尤其是对这些命名空间的解构。看起来像1998年2月4日符合UUID草案规范的日期 - http://tools.ietf.org/html/draft-leach-uuids-guids-01 – Gareth

+1

命名空间UUID是版本1.我相信你计算正确的日期。最后12个十六进制字符是主机ID,通常是从生成UUID的机器的MAC地址计算出来的。使用在线OUI数据库,我们可以知道“00c04f”是指它是在Dell盒子上生成的。就我个人而言,我想知道“6ba7b813”发生了什么...... :) –

+0

@ChrisCogdon回复:“发生了什么事情”6ba7b813“' - 也许这些规范作者是triskaidekaphobic,或者担心我们是。 :) –

2

如果我正在生成自己的名称空间UUID,是否需要特别避免任何事情?

不可以。您的命名空间UUID可以是以任何常规方式生成的任何UUID。因此,例如,您可能希望生成版本1或版本4 UUID以用作您的名称空间UUID。这可以通过Linux或OS X上的uuidgen程序完成。或者,您可以轻松地在线生成version 1version 4 UUID。

+1

或者,使用其中一个标准名称空间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知道该怎么做。 :) –