¿Qué versión del UUID deberías usar? Vi muchos hilos explicando lo que implica cada versión, pero tengo problemas para descubrir qué es lo mejor para qué aplicaciones.
¿Qué versión del UUID deberías usar? Vi muchos hilos explicando lo que implica cada versión, pero tengo problemas para descubrir qué es lo mejor para qué aplicaciones.
Respuestas:
Hay dos formas diferentes de generar un UUID.
Si solo necesita una identificación única, quiere una versión 1 o 4.
Versión 1: Esto genera una identificación única basada en una dirección MAC de la tarjeta de red y un temporizador. Estos ID son fáciles de predecir (dado uno, podría adivinar otro) y pueden rastrearse hasta su tarjeta de red. No se recomienda crear estos.
Versión 4: se generan a partir de números aleatorios (o pseudoaleatorios). Si solo necesita generar un UUID, esto es probablemente lo que desea.
Si necesita generar siempre el mismo UUID a partir de un nombre de pila, desea una versión 3 o 5.
Versión 3: Esto genera una identificación única a partir de un hash MD5 de un espacio de nombres y nombre. Si necesita compatibilidad con versiones anteriores (con otro sistema que genera UUID a partir de nombres), use esto.
Versión 5: Esto genera una identificación única a partir de un hash SHA-1 de un espacio de nombres y nombre. Esta es la versión preferida.
reproducible
UUID a partir de un nombre dado, desea una versión 3 o versión 5. Si alimenta ese algoritmo con la misma entrada, generará la misma salida.
Si desea un número aleatorio, use una biblioteca de números aleatorios. Si desea un identificador único con efectivamente 0.00 ... muchos más ceros aquí ... 001% de probabilidad de colisión, debe usar UUIDv1. Vea la publicación de Nick para UUIDv3 y v5.
UUIDv1 NO es seguro. No está destinado a ser. Está destinado a ser ÚNICO, no indescifrable. UUIDv1 usa la marca de tiempo actual, más un identificador de máquina, más algunas cosas aleatorias para crear un número que ese algoritmo nunca volverá a generar. Esto es apropiado para una ID de transacción (incluso si todos están haciendo millones de transacciones / s).
Para ser honesto, no entiendo por qué existe UUIDv4 ... al leer RFC4122 , parece que esa versión NO elimina la posibilidad de colisiones. Es solo un generador de números aleatorios. Si eso es cierto, tiene una muy buena posibilidad de que dos máquinas en el mundo eventualmente creen el mismo "UUID" v4 (cita porque no hay un mecanismo para garantizar la unicidad U. universal). En esa situación, no creo que el algoritmo pertenezca a un RFC que describa métodos para generar valores únicos. Pertenecería a un RFC sobre la generación de aleatoriedad. Para un conjunto de números aleatorios:
chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)
set_size
es 2 ^ 122, que es muy grande .
Esa es una pregunta muy general. Una respuesta es: "depende del tipo de UUID que desee generar". Pero una mejor es esta: "Bueno, antes de responder, ¿puede decirnos por qué necesita codificar su propio algoritmo de generación de UUID en lugar de llamar a la funcionalidad de generación de UUID que ofrecen los sistemas operativos más modernos?"
Hacerlo es más fácil y seguro, y dado que probablemente no necesite generar el suyo propio, ¿por qué molestarse en codificar una implementación? En ese caso, la respuesta se convierte en usar lo que sea que proporcione su O / S, lenguaje de programación o marco. Por ejemplo, en Windows, hay CoCreateGuid o UuidCreate o uno de los diversos envoltorios disponibles de los numerosos marcos en uso. En Linux hay uuid_generate .
Si, por alguna razón, absolutamente necesita generar el suyo propio, al menos tenga el buen sentido de mantenerse alejado de generar UUID v1 y v2. Es complicado hacerlo bien. Apéguese, en cambio, a los UUID v3, v4 o v5.
Actualización : en un comentario, mencionas que estás usando Python y haces un enlace a esto . Mirando a través de la interfaz proporcionada, la opción más fácil para usted sería generar un UUID v4 (es decir, uno creado a partir de datos aleatorios) llamando uuid.uuid4()
.
Si tiene algunos datos que necesita (o puede) hacer hash para generar un UUID, entonces puede usar v3 (que se basa en MD5) o v5 (que se basa en SHA1). Generar un UUID v3 o v5 es simple: primero elija el tipo de UUID que desea generar (probablemente debería elegir v5) y luego elija el espacio de nombres apropiado y llame a la función con los datos que desea usar para generar el UUID. Por ejemplo, si está troquelando una URL, usaría NAMESPACE_URL
:
uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')
Tenga en cuenta que este UUID será diferente del UUID v5 para la misma URL, que se genera así:
uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')
Una buena propiedad de las URL v3 y v5 es que deberían ser interoperables entre implementaciones. En otras palabras, si dos sistemas diferentes están utilizando una implementación que cumple con RFC4122, ambos (o al menos deberían ) generarán el mismo UUID si todas las demás cosas son iguales (es decir, generarán la misma versión de UUID, con el mismo espacio de nombres y mismos datos) Esta propiedad puede ser muy útil en algunas situaciones (especialmente en escenarios de almacenamiento de contenido direccionable), pero quizás no en su caso particular.
NAMESPACE_URL
es un UUID generalmente igual a 6ba7b811-9dad-11d1-80b4-00c04fd430c8
, siguiendo la recomendación hecha en la página 30 de RFC-4122 .
La documentación de Postgres describe las diferencias entre UUID
s. Un par de ellos:
V3:
uuid_generate_v3(namespace uuid, name text)
- Esta función genera un UUID versión 3 en el espacio de nombres dado usando el nombre de entrada especificado.
V4:
uuid_generate_v4
- Esta función genera un UUID versión 4, que se deriva completamente de números aleatorios.