UUID名称空间来自哪里?

时间:2011-10-11 10:57:05

标签: language-agnostic uuid standards

UUID specification定义了4个预定义的名称空间,它描述为“可能有趣” - 其中包括“如果其他人在此命名空间中生成了UUID,则可以验证它们”:

  • 6ba7b810-9dad-11d1-80b4-00c04fd430c8用于DNS
  • 6ba7b811-9dad-11d1-80b4-00c04fd430c8的网址
  • 6ba7b812-9dad-11d1-80b4-00c04fd430c8用于ISO OID
  • 6ba7b814-9dad-11d1-80b4-00c04fd430c8 for X.500 DN

这些来自哪里?

具体而言;

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

2 个答案:

答案 0 :(得分:42)

首先,要明确的是,整个讨论仅限于版本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中的参数似乎相关:

      

    互操作性,以任何形式,与其他变体不同   这里定义的不保证,并且不太可能成为问题   实践。


  3.   
        
    • 为什么他们选择第4个八位字节作为UUID'版本号'来增加?
    •   

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

    请注意,(0-index)第8个八位位组在所有情况下均以8开头,因此我们正在处理 RFC 4122变体 UUID。呼。

    现在查看八位字节6的版本:1,我们正在处理版本1基于时间的 UUID。

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


      
        
    • 我的问题是否意味着我遗漏了一些关于UUID的基本信息?
    •   

    不。关于UUID命名空间的讨论很少,因为随机UUID非常简单。

答案 1 :(得分:2)

  

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

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