Un UUID es un identificador de 128 bits que puede generar en cualquier lugar, sin un registro central, y aún así confiar en que es único. Pero no todos los UUID se construyen de la misma manera. Esta guía explica las cinco versiones que realmente encontrará, por qué v7 está ganando en claves de bases de datos, cómo los UUID de espacios de nombres siguen siendo deterministas y cuán improbable es realmente una colisión.
v4 vs v7 — random vs time-ordered
La versión 4 tiene 122 bits de pura aleatoriedad, lo que lo convierte en el UUID más simple y con mayor soporte. Su debilidad se muestra a escala: debido a que los valores están desordenados, la inserción de claves v4 en un índice de base de datos dispersa las escrituras en todo el árbol B, lo que provoca divisiones de página y errores de caché.
La versión 7 soluciona este problema colocando una marca de tiempo Unix de milisegundos de 48 bits en los bits altos. El resultado todavía tiene mucha aleatoriedad para ser único, pero los UUID consecutivos comparten un prefijo inicial, por lo que las nuevas filas se agregan una cerca de la otra. Esto mantiene los índices compactos y las inserciones son rápidas, razón por la cual la v7 es cada vez más la opción predeterminada para las nuevas claves primarias.
Namespace UUIDs (v5 and v3)
Las versiones 5 y 3 son deterministas. Les das un UUID de espacio de nombres y un nombre; concatenan los bytes y los codifican (SHA-1 para v5, MD5 para v3) y luego extraen un UUID del resumen. Las mismas entradas siempre producen el mismo UUID, lo cual es perfecto para derivar una identificación estable de algo que ya tiene, como una URL o una ruta de archivo.
Prefiera v5 a v3: SHA-1 es más potente que MD5 y v3 existe principalmente por compatibilidad con sistemas más antiguos. RFC 4122 incluye cuatro espacios de nombres estándar (DNS, URL, OID, X.500) y usted puede definir el suyo propio proporcionando cualquier UUID como espacio de nombres.
How likely is a collision?
Con 122 bits aleatorios, la versión 4 extrae aproximadamente 5,3 × 1036 valores posibles. Utilizando la aproximación del problema del cumpleaños, necesitaría generar aproximadamente 2,71 × 1018 (2,71 quintillones) de UUID antes de alcanzar incluso una probabilidad del 50 % de una sola colisión: alrededor de mil millones de UUID cada segundo durante 85 años.
v7 lleva menos datos aleatorios bits (74), pero los limita a un solo milisegundo, por lo que el riesgo práctico de colisión solo importa si genera volúmenes enormes en el mismo milisegundo en la misma máquina. Para prácticamente todas las aplicaciones, ambas versiones pueden considerarse libres de colisiones.