¿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:
| Grupo | Caracteres | Bytes | Descripción |
|---|---|---|---|
| 1 | 8 hex | 4 | time_low |
| 2 | 4 hex | 2 | time_mid |
| 3 | 4 hex | 2 | time_hi + versión |
| 4 | 4 hex | 2 | clock_seq + variante |
| 5 | 12 hex | 6 | nodo |
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:
| Alternativa | Tamaño | Ordenable | Legibilidad | Uso típico |
|---|---|---|---|---|
| UUID v4 | 36 chars | No | Baja | General |
| UUID v7 | 36 chars | Sí | Baja | Bases de datos |
| ULID | 26 chars | Sí | Media | APIs modernas |
| NanoID | Configurable | No | Alta | IDs cortos en frontend |
| CUID2 | 24 chars | No | Media | Aplicaciones web |
| Auto-increment | Variable | Sí | Alta | BD 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.