DevToolBoxGRATIS
Blog

UUID v4 vs UUID v7 vs ULID vs NanoID: ¿Qué ID deberías usar?

10 min de lecturapor DevToolBox
Ad Space

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ísticaUUID v4UUID v7ULIDNanoID
Tamaño (bytes)161616Configurable (default 21 chars)
Longitud de cadena36 chars36 chars26 chars21 chars (default)
Ordenado por tiempoNoYes (ms precision)Yes (ms precision)No
EstándarRFC 9562RFC 9562Community specCommunity spec
Compatible con índices DBPoorExcellentExcellentPoor
Resistencia a colisiones122 random bits74 random bits + timestamp80 random bits + timestampConfigurable
Seguro para URLYes (with encoding)Yes (with encoding)Yes (native)Yes (native)
Soporte de lenguajesUniversalGrowing rapidlyGoodExcellent (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 portion

ULID: 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 ID1M inserciones (PostgreSQL)Tamaño del índicePatrón de inserción
Auto-incremento~12s (baseline)21 MBSequential
UUID v7~15s (+25%)56 MBNearly sequential
ULID~15s (+25%)56 MBNearly sequential
UUID v4~28s (+133%)56 MBRandom
NanoID (21 chars)~30s (+150%)62 MBRandom

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 generation

Preguntas 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.

Prueba estas herramientas relacionadas

IDUUID Generator
Ad Space

Artículos relacionados

Codificación Base64 en la práctica: 7 usos que todo desarrollador debería conocer

Descubre 7 usos prácticos de la codificación Base64: imágenes incrustadas, secretos Kubernetes, tokens JWT y URIs de datos.