2011-10-11 11 views
38

El UUID specification define 4 espacios de nombres predefinidos que califica de "potencialmente interesante" - lo que significa, entre otras cosas, "si otras personas han generado UUID en este espacio de nombres que pueden verificarlos":¿De dónde provienen los espacios de nombres UUID?

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

¿De dónde vienen estos?

Específicamente;

  • Si estoy generando mi propio UUID de espacio de nombres, ¿debo evitar algo en particular?
  • Soy consciente de cuán grande es el espacio UUID, pero ¿esto tiene alguna implicación en las colisiones?
  • ¿Por qué han elegido el 4to octeto para aumentar como una especie de 'número de versión' de UUID?
  • ¿Mis preguntas implican que me falta algo fundamental sobre los UUID?
+1

El rfc4122 dice: "Los mecanismos o convenciones que se utilizan para la asignación de nombres y asegurar su singularidad dentro de sus espacios de nombres están más allá del alcance de esta especificación ." en 4.3 ^^ Pero no sé dónde está especificado. –

Respuesta

41

Primero, para ser claros, todo este debate está limitado a la versión 3 & 5 UUID. En mi experiencia (anecdótica), los UUID de la versión 4 (al azar) son los más comúnmente utilizados.

4122 's namespaced algoritmo de generación de UUID empieza ambiguamente:

Asignar un UUID para usar como un "nombre de ID de espacio"

No hay otra mención de "ID de espacio de nombre de" asignación , y ni yo ni python he encontrado espacios estandarizados más allá de los cuatro enumerados en RFC 4122.

Así que la respuesta a su primera pregunta,

  • Si estoy generando mi propio UUID de espacio de nombres, ¿debo evitar algo en particular?

Solo necesita evitar los cuatro espacios de nombres estándar.


La siguiente pregunta,

  • Soy consciente de cuán grande es el espacio UUID es, pero ¿Esto tiene ninguna incidencia en las colisiones?

tiene dos partes:

  1. Will UUID dentro de su espacio de nombres colisionar? Verbatim de 4122:

    Los UUID generados a partir de dos nombres diferentes en [su] espacio de nombres deben ser diferentes (con muy alta probabilidad).

  2. ¿Tu espacio de nombres UUID colisionará con otros espacios de nombres? No pude encontrar una respuesta directa, ya que no hay un estándar para la asignación de "ID de espacio de nombre", pero el argumento en section 4.1.1 parece relevante:

    Interoperabilidad, en cualquier forma, con las variantes distintas de la definido aquí no está garantizado, y no es probable que sea un problema en la práctica .


  • ¿Por qué han elegido el cuarto octeto para aumentar como una especie de UUID 'número de versión'?

Este es un misterio. Afortunadamente, tenemos una especificación para UUID, por lo que podemos extraerlos para obtener información.

Tenga en cuenta que el (0-índice) octavo octeto comienza con 8 en todos los casos, por lo que estamos tratando con RFC 4122 variante UUID. Uf.

Ahora compruebe el octeto 6 para la versión: 1, estamos tratando con versión 1 basado en tiempo UUID.

Este answer tiene un algoritmo útil para extraer las fechas de pitón de los UUID de la versión 1. La aplicación del algoritmo produce un tiempo en 4 de febrero de 1998. Aún no he encontrado significado en esta fecha. Incrementar el tercer octeto agrega el menor intervalo de tiempo codificable (100ns) a la fecha.


  • hacer mi pregunta implica que me falta algo fundamental acerca de UUID?

Nope. Hay muy poca discusión sobre los espacios de nombres de UUID, ya que los UUID aleatorios son muy fáciles.

+7

Eso es genial, especialmente la deconstrucción de esos espacios de nombres. Parece que el 4 de febrero de 1998 corresponde a la fecha del borrador de la especificación UUID - http://tools.ietf.org/html/draft-leach-uuids-guids-01 – Gareth

+1

Los UUID del espacio de nombres son la versión 1. Creo que calculó la fecha correcta. Los últimos 12 caracteres hexadecimales son la identificación del host, y generalmente se calculan a partir de la dirección MAC de la máquina que genera el UUID. Al utilizar las bases de datos de OUI en línea, podemos decir que "00c04f" significa que se generó en un cuadro de Dell. Personalmente, quiero saber qué pasó con "6ba7b813" ... :) –

+0

@ChrisCogdon re: 'qué pasó con" 6ba7b813 "' - tal vez los escritores de especificaciones eran triskaidekaphobic, o temían que fuéramos. :) –

2

Si estoy generando mi propio UUID del espacio de nombres, ¿debo evitar algo en particular?

No. Su UUID de espacio de nombres puede ser cualquier UUID generado de cualquiera de las formas normales. Entonces, por ejemplo, probablemente desee generar un UUID de versión 1 o 4 para usar como UUID del espacio de nombre.Esto se puede hacer con el programa uuidgen en Linux o OS X. O puede generar fácilmente un UUID version 1 o version 4 en línea.

+1

Como alternativa, use uno de los UUID de espacio de nombres estándar (Apéndice C de RFC 4122) y la cadena de su espacio de nombres para generar el UUID de espacio de nombres raíz 'your'. Luego use eso y los nombres dentro de ese espacio de nombres para generar cada UUID necesario. Por ejemplo, algo como: 'root = uuid (uuid.URL," www.example.com "); page1 = uuid (root, "page1.html"); page2 = uuid (root, "page2.html"); '// sí, asumo que el administrador de uuid sabe qué hacer. :) –

Cuestiones relacionadas