Resumen de UUID v4 y v7
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: Estructura
UUID v4 asigna 122 bits a la aleatoriedad. Los 6 bits restantes están reservados:
- 4 bits codifican la versión (0100 = 4)
- 2 bits codifican la variante (10 para RFC 4122)
xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx
UUID v7: Estructura
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.
Por qué los UUID Aleatorios Reducen el Rendimiento de Base de Datos?
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.
Que Versión Usar Cuando
Usa UUID v4 para:
- Tokens de seguridad, claves de API, ID de sesión o cualquier cosa que no deba revelar el momento de creación
- Identificadores que nunca se usaran como claves de indice de base de datos
- Datos de prueba donde el orden no importa
Usa UUID v7 para:
- Claves primarias de base de datos en tablas con escrituras frecuentes
- Identificadores de eventos de registro donde el orden temporal ayuda en las consultas
- Cualquier sistema donde necesites ordenar por ID de creación
Usa ULID cuando:
- Necesites una representación más corta que UUID (26 caracteres Base32 vs 36 caracteres hexadecimales)
- Quieras compatibilidad con mayusculas/minusculas y sin caracteres especiales
- Pero considera que ULID tiene menos aleatoriedad (80 bits) que UUID v7 (74 bits en los últimos 74 bits)