2011-10-11 10 views
38

Il UUID specification definisce 4 spazi dei nomi predefiniti da essa definiti "potenzialmente interessante" - che significa tra le altre cose, "se altre persone hanno generato UUID in questo spazio dei nomi li si può verificare":Da dove provengono gli spazi dei nomi UUID?

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

Da dove vengono questi?

In particolare;

  • Se sto generando il mio spazio dei nomi UUID, devo evitare qualcosa in particolare?
  • Sono consapevole di quanto è grande lo spazio UUID, ma ciò ha implicazioni sulle collisioni?
  • Perché hanno scelto il 4 ° ottetto per aumentare come una sorta di 'numero di versione UUID'?
  • Le mie domande implicano che mi manca qualcosa di fondamentale sugli UUID?
+1

Il RFC4122 dice: "I meccanismi o convenzioni usate per allocare nomi e garantendo loro unicità nel loro spazi nome esulano dall'ambito di questa specifica." in 4.3 ^^ Ma non so dove è specificato. –

risposta

41

In primo luogo, per essere chiari, l'intera discussione è limitata alla versione 3 & 5 UUID. Nella mia esperienza (aneddotica), gli UUID versione 4 (casuali) sono più comunemente usati.

4122 's algoritmo di generazione UUID namespace inizia in modo ambiguo:

assegnare un UUID da utilizzare come "nome dello spazio ID"

Non c'è altra menzione di "ID spazio dei nomi" allocazione e né I né python hanno trovato spazi standardizzati oltre i quattro elencati in RFC 4122.

Quindi la risposta alla prima domanda,

  • Se sto generando il mio spazio dei nomi UUID devo evitare qualcosa in particolare?

È necessario solo evitare i quattro spazi dei nomi standard.


La domanda successiva,

  • Sono consapevole quanto è grande lo spazio UUID è, ma questo ha alcuna conseguenza per le collisioni?

ha due parti:

  1. Sarà UUID all'interno del vostro spazio dei nomi collidere? Verbatim dal 4122:

    I UUID generati da due nomi diversi in [vostro] namespace dovrebbe essere diverso (con probabilità molto alta).

  2. Il tuo UUID dello spazio dei nomi entrerà in collisione con altri spazi dei nomi? Non riuscivo a trovare una risposta diretta, dal momento che non c'è alcuna norma per "spazio dei nomi ID" di assegnazione, ma l'argomento in section 4.1.1 sembra rilevante:

    interoperabilità, in qualsiasi forma, con varianti diverse da quella definito qui non è garantito e non è probabile che sia un problema nella pratica .


  • Perché hanno scelto il quarto ottetto di aumentare come una sorta di UUID 'il numero di versione'?

Questo è un po 'un mistero. Fortunatamente, abbiamo una specifica per gli UUID, quindi possiamo ricavarli per qualche intuizione.

Si noti che il (0-index) 8 ° ottetto inizia con 8 in tutti i casi, quindi abbiamo a che fare con RFC 4122 variante UUID. Uff.

Ora controlla l'ottetto 6 per la versione: 1, ci stiamo occupando degli UUID versione 1 basati sul tempo.

Questo answer dispone di un pratico algoritmo per l'estrazione di datetime python dagli UUID versione 1. L'applicazione dell'algoritmo produce un tempo in 4 febbraio 1998. Devo ancora trovare un significato in questa data. L'incremento del 3 ° ottetto aggiunge il più piccolo intervallo di tempo codificabile (100 ns) alla data.


  • Do le mie domande implica che mi manca qualcosa di fondamentale sulla UUID?

No. Ci sono poche discussioni sugli spazi dei nomi UUID, poiché gli UUID casuali sono così semplici.

+7

È grandioso, specialmente la decostruzione di quegli spazi dei nomi. Sembra che il 4 febbraio 1998 corrisponda alla data della specifica della bozza UUID - http://tools.ietf.org/html/draft-leach-uuids-guids-01 – Gareth

+1

Gli UUID dello spazio dei nomi sono la versione 1. Credo che tu abbia calcolato la data corretta I 12 caratteri esadecimali finali sono l'ID host e in genere calcolati dall'indirizzo MAC della macchina che genera l'UUID. Usando i database OUI on-line, possiamo dire che "00c04f" significa che è stato generato su una scatola Dell. Personalmente, voglio sapere cosa è successo a "6ba7b813" ... :) –

+0

@ChrisCogdon re: 'cosa è successo a" 6ba7b813 "' - forse gli autori delle specifiche erano triskaidekaphobic, o temevamo di essere. :) –

2

Se sto generando il mio spazio dei nomi UUID devo evitare qualcosa in particolare?

No. L'UUID dello spazio dei nomi può essere un UUID generato in uno qualsiasi dei modi normali. Ad esempio, probabilmente vorrai generare un UUID versione 1 o versione 4 da utilizzare come UUID dello spazio dei nomi.Questo può essere fatto con il programma uuidgen su Linux o OS X. Oppure puoi facilmente generare un version 1 o version 4 UUID online.

+1

In alternativa, utilizzare uno degli UUID dello spazio dei nomi standard (Appendice C di RFC 4122) e la stringa del proprio spazio dei nomi per generare l'UUID dello spazio dei nomi root 'your'. Quindi usa questo e i nomi all'interno di quel namespace per generare ogni UUID necessario. Ad esempio, qualcosa come: 'root = uuid (uuid.URL," www.example.com "); page1 = uuid (root, "page1.html"); page2 = uuid (root, "page2.html"); '// sì, sto assumendo che il responsabile di uuid sappia cosa fare. :) –