Elegir el formato correcto de identificador único para tu aplicación es una decisión que afecta el rendimiento de la base de datos, la escalabilidad y la experiencia del desarrollador. Con UUID v7 ahora como estándar oficial (RFC 9562, publicado en 2024), el panorama de la generación de IDs ha cambiado significativamente. Esta guía compara las cuatro opciones más populares.
Tabla de comparación rápida
| Característica | UUID v4 | UUID v7 | ULID | NanoID |
|---|---|---|---|---|
| Tamaño (bytes) | 16 | 16 | 16 | Configurable (default 21 chars) |
| Longitud de cadena | 36 chars | 36 chars | 26 chars | 21 chars (default) |
| Ordenado por tiempo | No | Yes (ms precision) | Yes (ms precision) | No |
| Estándar | RFC 9562 | RFC 9562 | Community spec | Community spec |
| Compatible con índices DB | Poor | Excellent | Excellent | Poor |
| Resistencia a colisiones | 122 random bits | 74 random bits + timestamp | 80 random bits + timestamp | Configurable |
| Seguro para URL | Yes (with encoding) | Yes (with encoding) | Yes (native) | Yes (native) |
| Soporte de lenguajes | Universal | Growing rapidly | Good | Excellent (JS/TS) |
UUID v4: El estándar establecido
UUID v4 ha sido la opción predeterminada durante más de una década. Genera identificadores de 128 bits utilizando 122 bits de aleatoriedad, produciendo el formato familiar xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.
Fortalezas:
- Soporte universal de bibliotecas en todos los lenguajes de programación
- No se necesita coordinación — genera en cualquier lugar, en cualquier momento
- Simple y bien comprendido
Debilidades:
- La distribución aleatoria causa fragmentación del índice B-tree en las bases de datos
- Sin información temporal — no se puede ordenar por orden de creación
- A gran escala (millones de filas), el rendimiento de inserción se degrada significativamente
// JavaScript
crypto.randomUUID();
// → "f47ac10b-58cc-4372-a567-0e02b2c3d479"Prueba nuestra herramienta Generador de UUID →
UUID v7: El nuevo estándar (RFC 9562)
UUID v7, finalizado en RFC 9562 (2024), está diseñado específicamente para su uso como claves de base de datos. Combina una marca de tiempo Unix de 48 bits (precisión de milisegundos) con 74 bits de aleatoriedad, produciendo UUIDs ordenados por tiempo totalmente compatibles con la infraestructura UUID existente.
Fortalezas:
- Ordenado por tiempo — ordena naturalmente por fecha de creación
- Excelente rendimiento de inserción en base de datos (sin fragmentación de índice)
- Compatible con todas las columnas y herramientas UUID existentes
- Soporte nativo en PostgreSQL 17+
Debilidades:
- Menos bits aleatorios (74 vs 122) — aún astronómicamente resistente a colisiones
- La marca de tiempo está incrustada — revela la hora aproximada de creación
- El soporte de bibliotecas aún está creciendo (pero rápidamente)
// Node.js (uuid library v9+)
import { v7 as uuidv7 } from 'uuid';
uuidv7();
// → "018e4f5c-6a7b-7000-8000-1234abcd5678"
// ^^^^^^^^^^^^^^^^ timestamp portionULID: Ordenable lexicográficamente
ULID (Universally Unique Lexicographically Sortable Identifier) es anterior a UUID v7 y comparte un diseño similar: marca de tiempo de 48 bits + 80 bits de aleatoriedad. La diferencia clave es su codificación: Crockford Base32, que produce cadenas compactas de 26 caracteres como 01ARZ3NDEKTSV4RRFFQ69G5FAV.
Fortalezas:
- Representación compacta en cadena (26 caracteres vs 36 de UUID)
- Monotonía incorporada — los IDs generados en el mismo milisegundo siguen ordenados
- Ordenable lexicográficamente como cadena (sin comparación especial necesaria)
- Insensible a mayúsculas y seguro para URL
Debilidades:
- No es un estándar RFC — solo especificación de la comunidad
- No compatible con columnas UUID sin conversión
- Menos soporte de bibliotecas que UUID
// JavaScript
import { ulid } from 'ulid';
ulid();
// → "01ARZ3NDEKTSV4RRFFQ69G5FAV"NanoID: Compacto y personalizable
NanoID adopta un enfoque diferente: en lugar de un formato fijo, genera cadenas aleatorias compactas y seguras para URL con un alfabeto y longitud configurables. El valor predeterminado es de 21 caracteres usando A-Za-z0-9_-.
Fortalezas:
- Muy compacto (21 caracteres por defecto, personalizable)
- Seguro para URL por defecto
- Alfabeto y longitud personalizables
- Biblioteca diminuta (~130 bytes gzipped) — perfecta para el frontend
- Criptográficamente fuerte (usa crypto.getRandomValues)
Debilidades:
- Sin ordenamiento temporal — mismos problemas de fragmentación B-tree que UUID v4
- Sin especificación estándar
- No compatible con la infraestructura UUID
// JavaScript
import { nanoid } from 'nanoid';
nanoid();
// → "V1StGXR8_Z5jdHi6B-myT"Guía de decisión: ¿Cuál deberías elegir?
Usa UUID v7 cuando:
- Estés construyendo una nueva aplicación con una base de datos relacional
- Necesites IDs ordenados por tiempo para indexación eficiente
- Tu sistema espera el formato UUID estándar (PostgreSQL, MySQL, etc.)
- Quieras el mejor equilibrio entre compatibilidad y rendimiento
Usa UUID v4 cuando:
- Trabajes con sistemas que solo soportan UUID v4
- Necesites máxima aleatoriedad sin filtración de marca de tiempo
- La escala de la base de datos es de pequeña a mediana (< 1M filas)
Usa ULID cuando:
- Necesites representaciones de cadena más cortas
- Trabajes con sistemas que ordenan cadenas lexicográficamente
- La monotonía dentro del mismo milisegundo es importante
- No necesites compatibilidad con columnas UUID
Usa NanoID cuando:
- Generes IDs en el navegador o frontend
- El tamaño del bundle importa (NanoID tiene 130 bytes)
- Necesites identificadores cortos y compatibles con URL
- Estés construyendo acortadores de URL, códigos de invitación o tokens de sesión
Benchmark de rendimiento: Inserciones en base de datos
La diferencia más impactante entre estos formatos es el rendimiento de inserción en base de datos. Los IDs ordenados por tiempo (UUID v7, ULID) mantienen inserciones B-tree secuenciales, mientras que los IDs aleatorios (UUID v4, NanoID) causan divisiones de páginas aleatorias:
| Formato de ID | 1M inserciones (PostgreSQL) | Tamaño del índice | Patrón de inserción |
|---|---|---|---|
| Auto-incremento | ~12s (baseline) | 21 MB | Sequential |
| UUID v7 | ~15s (+25%) | 56 MB | Nearly sequential |
| ULID | ~15s (+25%) | 56 MB | Nearly sequential |
| UUID v4 | ~28s (+133%) | 56 MB | Random |
| NanoID (21 chars) | ~30s (+150%) | 62 MB | Random |
Los datos del benchmark son aproximados y varían según el hardware, la versión de la base de datos y la estructura de las tablas. La diferencia relativa es consistente en todos los entornos.
Ruta de migración: UUID v4 a UUID v7
Si estás considerando migrar de UUID v4 a UUID v7, la buena noticia es que comparten el mismo formato de 128 bits y la misma representación en cadena. En la mayoría de las bases de datos, puedes comenzar a generar valores UUID v7 para nuevas filas mientras los valores UUID v4 existentes siguen siendo válidos:
-- PostgreSQL 17+
CREATE TABLE users (
id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY,
name TEXT NOT NULL
);
-- Older PostgreSQL with uuid-ossp or pgcrypto
-- Use application-level UUID v7 generationPreguntas frecuentes
¿Debería migrar de UUID v4 a UUID v7?
Si tu aplicación utiliza UUIDs como claves primarias de base de datos y experimentas fragmentación de índice o inserciones lentas a gran escala, vale la pena considerar la migración a UUID v7. Para aplicaciones de tamaño pequeño a mediano, UUID v4 funciona bien.
¿Es NanoID seguro para claves primarias de base de datos?
NanoID es criptográficamente seguro y tiene una longitud configurable, pero carece de ordenamiento temporal. Para claves primarias de base de datos donde el rendimiento de inserción importa, UUID v7 o ULID son mejores opciones. NanoID destaca en aplicaciones frontend y acortadores de URL.
¿Cuál es la diferencia entre UUID v7 y ULID?
Ambos son identificadores únicos ordenados por tiempo. UUID v7 sigue RFC 9562 y es compatible con la infraestructura UUID existente (128 bits, formato estándar). ULID usa codificación Crockford Base32 (26 caracteres) y tiene monotonía incorporada dentro del mismo milisegundo. UUID v7 es mejor para sistemas que esperan formato UUID; ULID es más compacto como cadena.