Diferencias entre UUID v4 (aleatorio) y v7 (ordenado por tiempo). Estructura de bits, impacto en rendimiento B-tree, comparación con ULID y casos de uso.
Tanto UUID v4 como v7 son identificadores de 128 bits formateados como 32 caracteres hexadecimales agrupados en formato 8-4-4-4-12. La diferencia está en el contenido de esos bits.
UUID v4 se ve así:
f47ac10b-58cc-4372-a567-0e02b2c3d479
^^^^
nibble de versión = 4
UUID v7 se ve así:
018e2b3c-d4a1-7f2e-b8c9-1234567890ab
^^^^^^^^^^^^^
48 bits de tiempo Unix ms
^
nibble de versión = 7
Esta diferencia estructural tiene implicaciones reales de rendimiento para bases de datos.
UUID v4 asigna 122 bits a la aleatoriedad. Los 6 bits restantes están reservados:
xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx
UUID v7 fue estandarizado por RFC 9562 (mayo 2024). Los primeros 48 bits son el tiempo Unix en milisegundos, seguidos de bits de versión y datos aleatorios:
[48 bits tiempo Unix ms][4 bits versión = 7][12 bits aleatorios][2 bits variante][62 bits aleatorios]
El prefijo de tiempo Unix de 48 bits significa que los UUID generados en el mismo milisegundo tienen los bits más significativos casi identicos, y los UUID generados posteriormente son lexicograficamente mayores. Esta propiedad hace que v7 sea ideal para indices B-tree.
Los indices B-tree (usados por PostgreSQL, MySQL, SQL Server y otros) mantienen un orden secuencial. Con UUID v4, las nuevas claves se distribuyen uniformemente al azar en todo el espacio de 128 bits. La nueva clave casi nunca esta al final del indice, lo que causa constantes divisiones de página.
Con UUID v7, las nuevas claves siempre son mayores que las anteriores (dentro del mismo milisegundo). Las inserciones van a la página hoja más a la derecha del B-tree, las páginas se llenan secuencialmente y las divisiones son raras.
Usa UUID v4 para:
Usa UUID v7 para:
Usa ULID cuando:
Nothing you paste leaves this tab. Every tool runs entirely in your browser — no upload, no server, no account.