¿Qué es un UUID y por qué es tan útil?

¿Qué es un UUID y por qué es tan útil?

Descubre qué es un UUID, cómo funciona y por qué es indispensable en el desarrollo de software moderno.

Introducción

En el mundo del desarrollo de software, constantemente necesitamos identificadores únicos. Desde transacciones bancarias hasta nombres de archivos en la nube, garantizar la singularidad de cada elemento es indispensable para el correcto funcionamiento de los sistemas.

Imagina que dos usuarios de tu aplicación crean un registro al mismo tiempo, o que dos microservicios generan un ID en servidores diferentes. ¿Cómo garantizas que nunca colisionen? Aquí es donde entran los UUIDs.

¿Qué es un UUID?

Un UUID (Universally Unique Identifier), también llamado GUID (Globally Unique Identifier), es un número de 128 bits diseñado para ser único a nivel global. La probabilidad de que dos UUIDs generados independientemente sean idénticos es tan infinitesimalmente pequeña que, para fines prácticos, se considera cero.

Para ponerlo en perspectiva: si generaras 1 billón de UUIDs por segundo durante 85 años, la probabilidad de una sola colisión sería de aproximadamente el 50%. Esto lo hace invaluable para aplicaciones que requieren unicidad a gran escala sin necesidad de coordinación central.

Anatomía de un UUID

Todos los UUIDs siguen un formato estándar de 36 caracteres organizados en cinco grupos separados por guiones:

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

Donde:

  • x = dígitos hexadecimales (0-9, a-f)
  • M = indica la versión del UUID (1, 2, 3, 4, 5 o 7)
  • N = indica la variante del UUID (típicamente 8, 9, a, o b para RFC 4122)

Ejemplo: d112a206-8a8e-4b6a-87a2-f93eb293d09a

Los cinco grupos se componen de:

GrupoCaracteresBytesDescripción
18 hex4time_low
24 hex2time_mid
34 hex2time_hi + versión
44 hex2clock_seq + variante
512 hex6nodo

En total: 32 dígitos hexadecimales + 4 guiones = 36 caracteres.

Casos de uso

Los UUIDs son versátiles y se utilizan en numerosos escenarios del desarrollo moderno:

  • Claves primarias en bases de datos: Genera identificadores únicos sin depender de autoincrementos, ideal para sistemas distribuidos donde múltiples nodos escriben simultáneamente
  • Identificación de sesiones de usuario: Las aplicaciones web usan UUIDs para rastrear sesiones únicas, evitando que un atacante pueda adivinar IDs secuenciales
  • Nombres de archivos en la nube: Asignar UUIDs como nombres de archivo previene colisiones y evita exponer información en la URL
  • Trazabilidad en microservicios: Un UUID de correlación permite rastrear una solicitud a través de múltiples servicios, facilitando el debugging en arquitecturas distribuidas
  • Identificadores de recursos en APIs: Muchas APIs REST utilizan UUIDs para referenciar recursos de forma consistente, escalable y sin exponer la estructura interna de la base de datos
  • Idempotencia en operaciones: Incluir un UUID en solicitudes HTTP permite detectar y evitar duplicados en reintentos de red

Versiones de UUID

Existen varias versiones definidas en el RFC 4122, cada una con un método de generación distinto.

Versión 1 — Basada en tiempo + MAC

Generado a partir de la marca de tiempo actual y la dirección MAC del dispositivo. Garantiza unicidad global pero revela información del dispositivo y el momento de creación, lo cual puede ser un problema de privacidad.

Versión 2 — DCE Security

Similar a la v1 pero incorpora identificadores de dominio (POSIX UID/GID). Es poco utilizada en la práctica.

Versión 3 y 5 — Basadas en nombre

Generados mediante hashing de un namespace y un nombre (MD5 para v3, SHA-1 para v5). Producen el mismo UUID a partir de las mismas entradas, lo cual es útil cuando necesitas un identificador determinista y reproducible.

UUID v5("https://example.com") → siempre genera el mismo resultado

Versión 4 — Aleatoria

Generado a partir de números aleatorios/pseudoaleatorios. Es la versión más utilizada por su simplicidad: no requiere estado, no depende del hardware y es trivial de implementar.

Versión 7 — Basada en tiempo Unix (moderna)

Definida en el RFC 9562, la v7 es la evolución moderna del UUID. Combina una marca de tiempo Unix en milisegundos con bits aleatorios. Su ventaja principal: los UUIDs son ordenables cronológicamente, lo que mejora significativamente el rendimiento en índices de bases de datos.

0192d4e0-7b3a-7f28-9e1f-4a5b6c7d8e9f
│              │
└─ timestamp ──┘  └─ aleatorio

Recomendación: Si empiezas un proyecto nuevo, considera usar UUID v7 en lugar de v4 para claves primarias. La ordenabilidad temporal mejora el rendimiento de INSERT y consultas por rango en bases de datos como PostgreSQL y MySQL.

¿UUID vs. otras alternativas?

Los UUIDs no son la única opción para identificadores únicos. Aquí una comparación rápida:

AlternativaTamañoOrdenableLegibilidadUso típico
UUID v436 charsNoBajaGeneral
UUID v736 charsBajaBases de datos
ULID26 charsMediaAPIs modernas
NanoIDConfigurableNoAltaIDs cortos en frontend
CUID224 charsNoMediaAplicaciones web
Auto-incrementVariableAltaBD simples / no distribuidas

Cada opción tiene trade-offs. Los UUIDs destacan por su estandarización, soporte nativo en bases de datos y universalidad.

Generar UUIDs con JavaScript

Usando crypto.randomUUID() (Nativo)

Los navegadores modernos y Node.js (v19+) incluyen soporte nativo para generar UUIDs v4 sin dependencias externas:

const id = crypto.randomUUID();
console.log(id); // => "3b241101-e2bb-4d7a-8613-e2f4acbf4580"

Esta es la opción más simple y recomendada si solo necesitas UUID v4 y tu entorno lo soporta.

Usando la librería uuid

La librería uuid es la opción más completa, soportando múltiples versiones y validación.

Instalación:

npm install uuid

Uso básico:

import { v4 as uuidv4, v7 as uuidv7, validate } from 'uuid';

// Generar UUID v4 (aleatorio)
console.log(uuidv4()); // => "e845c251-c1d6-4917-9e3b-6f190e0cd52e"

// Generar UUID v7 (ordenable por tiempo)
console.log(uuidv7()); // => "0192d4e0-7b3a-7f28-9e1f-4a5b6c7d8e9f"

// Validar un UUID
validate("not-a-uuid");                              // => false
validate("e845c251-c1d6-4917-9e3b-6f190e0cd52e");   // => true

Vía CDN (Navegador):

<script type="module">
  import { v4 as uuidv4 } from 'https://jspm.dev/uuid';
  console.log(uuidv4()); // => "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"
</script>

Generación manual (Educativo)

Para entender el concepto (no recomendado para producción):

function uuidv4() {
  return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>
    (
      c ^
      (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))
    ).toString(16)
  );
}

console.log(uuidv4()); // => "30839af6-3d7d-4a48-bf68-49ec7dc05003"

Este método utiliza crypto.getRandomValues, una API nativa del navegador para generación de números aleatorios criptográficamente seguros. La función reemplaza los caracteres 0, 1 y 8 del template con valores aleatorios, respetando las reglas del formato UUID v4.

Conclusión

Los UUIDs resuelven un problema fundamental en la ingeniería de software: generar identificadores únicos sin coordinación central. Ya sea que estés diseñando una API REST, modelando una base de datos distribuida o simplemente necesites nombrar archivos sin colisiones, los UUIDs son una herramienta confiable y estandarizada.

Si estás empezando, usa UUID v4 con crypto.randomUUID() para la mayoría de casos. Si trabajas con bases de datos y necesitas rendimiento en índices, evalúa UUID v7. Y si la longitud del identificador es un problema, considera alternativas como ULID o NanoID.