2011-10-11 117 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知道該怎麼做。 :) –