UUID v4 vs v7: IDs aleatorios o IDs ordenados por tiempo
Guía de UUID v4 vs v7
UUID v4 vs v7 (y GUID vs UUID): cuál usar | We.Inc
En qué se diferencia UUID v7 de v4 según RFC 9562, por qué los IDs ordenados por tiempo van bien como claves de base de datos, qué es un GUID y una herramienta en el navegador para crear IDs v4 y v7 y decodificar el timestamp de un v7.
Ambos son identificadores de 128 bits escritos con 36 caracteres. Un UUID v4 son 122 bits aleatorios, así que los valores nuevos caen en cualquier punto de un índice ordenado. Un UUID v7 empieza con un timestamp Unix de 48 bits en milisegundos seguido de bits aleatorios, así que los valores se ordenan aproximadamente por momento de creación. RFC 9562 recomienda v7 frente a las versiones basadas en tiempo más antiguas, v1 y v6.
Comparación de v4 y v7
UUID v4
UUID v7
Formado por
122 bits aleatorios
Timestamp de 48 bits en milisegundos más 74 bits aleatorios
Orden
Aleatorio
Aproximadamente por momento de creación
Revela el momento de creación
No
Sí, al milisegundo
Integrado en los navegadores
crypto.randomUUID()
No, usa unas pocas líneas de código o una librería
Ideal para
Tokens, IDs públicos, cualquier cosa que no deba revelar tiempos
Claves primarias de base de datos, logs, IDs de eventos
Elegir una versión de UUID es sobre todo una cuestión de base de datos. Las claves v4 aleatorias dispersan las inserciones por todo un índice, mientras que las claves v7 llegan en orden, igual que lo haría un número autoincremental, sin necesitar un contador central. Genera ambos tipos abajo y luego pega cualquier UUID para ver su versión y, en el caso de v7, el momento en que se creó.
Pulsa un botón de generar para crear un UUID v4 o v7 nuevo en tu navegador.
Cópialo, o pega cualquier UUID en el cuadro del decodificador.
El decodificador lee el dígito de versión y los bits de variante y, en v7, convierte los primeros 48 bits en una fecha y hora.
Genera varios valores v7 seguidos y fíjate en que sus primeros caracteres apenas cambian.
Guarda los UUID en una columna uuid nativa si tu base de datos la tiene. Dieciséis bytes ganan a una cadena de 36 caracteres en tamaño y en comparaciones.
No uses v7 donde el momento de creación sea sensible, como en tokens para restablecer contraseñas. Cualquiera que tenga el ID puede saber cuándo se creó.
crypto.randomUUID() solo funciona en páginas seguras (HTTPS o localhost). Con HTTP simple no está disponible.
Dos IDs v7 creados en el mismo milisegundo se ordenan por sus bits aleatorios, no por cuál llegó primero, salvo que tu librería use los métodos de contador opcionales que describe el RFC.
Preguntas frecuentes
¿Cuál es la diferencia entre un GUID y un UUID?
Ninguna que importe en la práctica. RFC 9562 define los UUID y señala que también se conocen como GUID, Globally Unique Identifiers, el nombre que usan las herramientas de Microsoft. Un GUID generado por .NET o SQL Server es un UUID con el mismo formato de 36 caracteres.
¿UUID v7 es un estándar oficial?
Sí. RFC 9562, publicado en 2024, define las versiones 6, 7 y 8 junto a las antiguas y deja obsoleto RFC 4122, el documento que describía los UUID antes.
¿UUID v7 es lo bastante único?
Cada milisegundo tiene 74 bits aleatorios para repartir, que es más que suficiente para casi cualquier sistema. Una colisión exigiría crear cantidades enormes de IDs en el mismo milisegundo exacto.
¿Puedo recuperar el momento de creación de un UUID v7?
Sí. Los primeros 12 dígitos hexadecimales son el tiempo Unix en milisegundos. Pega uno en el decodificador de arriba para verlo como fecha, o interpreta tú mismo esos dígitos como un número hexadecimal.
¿Debo cambiar las claves v4 existentes a v7?
Normalmente no. Ambos son UUID válidos y pueden convivir en la misma columna, así que las filas nuevas pueden usar v7 mientras las antiguas conservan sus valores v4. Reescribir claves primarias implica reescribir todas las claves foráneas que apuntan a ellas.
Por qué el orden importa en las bases de datos
La mayoría de bases de datos guardan las claves primarias en un B-tree. Cuando cada clave nueva es mayor que la anterior, las inserciones van al final del árbol y las páginas escritas recientemente se quedan en memoria. Las claves aleatorias obligan a escribir en páginas de todo el árbol, lo que supone más divisiones de página y más lecturas de disco a medida que crece la tabla.
RFC 9562 cita este problema de localidad como uno de sus motivos para añadir versiones ordenadas por tiempo, y v7 es la que recomienda para los sistemas nuevos.
Cómo leer la estructura
En la forma de texto, el 13.º dígito hexadecimal (el primero del tercer grupo) es la versión, así que un UUID v7 siempre tiene un 7 ahí y un v4 tiene un 4. El primer dígito del cuarto grupo es 8, 9, a o b en la variante estándar.
En v7, los 12 dígitos anteriores a la versión son el timestamp. Todo lo que va después del dígito de versión, salvo los dos bits de variante, es aleatorio.
Las ocho versiones de UUID
Versiones de UUID en RFC 9562
Versión
Formado por
Notas
Tiempo gregoriano más un ID de nodo, a menudo la dirección MAC
Heredada; mejor v7
Versión DCE Security, no especificada por RFC 9562
Poco común
Basada en nombre, hash MD5 de un namespace y un nombre
Misma entrada, mismo UUID
Bits aleatorios o pseudoaleatorios
La opción habitual por defecto
Basada en nombre, hash SHA-1 de un namespace y un nombre
Preferible a v3
El timestamp de v1 reordenado para que los valores se ordenen por tiempo
Mejor v7 en sistemas nuevos
Tiempo Unix Epoch en milisegundos más bits aleatorios
Claves ordenables
Estructura personalizada elegida por la implementación
Formatos experimentales o de fabricante
Código que puedes copiar
UUID v4 en el navegador o en Node
Integrado en los navegadores actuales en páginas seguras y en Node 19 y posteriores mediante el objeto global crypto. Devuelve una cadena de 36 caracteres.
UUID v7 sin librería
Escribe la hora actual en los primeros seis bytes y luego fija los bits de versión y variante. El resto sigue siendo aleatorio.
Leer la hora de un UUID v7
Los primeros 12 dígitos hexadecimales son milisegundos desde 1970, así que al interpretarlos obtienes un Date.
Generar y decodificar
Generar v4
Generar v7
Generado
Pulsa un botón para crear un UUID. Se crea en tu navegador y nunca se envía a ningún sitio.
Pega un UUID para decodificarlo
Versión: {v}
RFC 9562 (la estándar)
No es la variante RFC 9562
Creado: {v} (UTC)
Esta versión no lleva un timestamp Unix.
Eso no es un UUID. Se esperan 32 dígitos hexadecimales en grupos de 8-4-4-4-12.