UUID
¿Qué es un UUID?
UUID (Universally Unique Identifier) es un identificador de 128 bits diseñado para ser único en cualquier sistema, en cualquier momento, sin necesidad de una autoridad central que los coordine. Se representa como 32 dígitos hexadecimales divididos en 5 grupos separados por guiones:
550e8400-e29b-41d4-a716-446655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
^ ^
| Variante (bits 6-7 del grupo N)
Versión (4 bits del grupo M)
Versiones más usadas
Existen varias versiones. En el desarrollo web cotidiano solo necesitas conocer tres:
v4 — aleatorio (la más habitual)
Generado completamente al azar. Probabilidad de colisión prácticamente nula. Es el estándar por defecto en la mayoría de sistemas:
// En Node.js — módulo nativo desde v14.17
import { randomUUID } from 'node:crypto';
const id = randomUUID();
// '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
v7 — basado en timestamp (el nuevo estándar)
Combina un timestamp de alta resolución con bits aleatorios. A diferencia de v4, los UUIDs v7 son ordenables cronológicamente — generados en secuencia, quedan en orden. Esto mejora el rendimiento en índices de bases de datos:
// Con el paquete 'uuid'
import { v7 as uuidv7 } from 'uuid';
const id = uuidv7();
// '018f5b2a-3c4d-7e2f-9a1b-0c5d6e7f8a9b'
// ^^^^^^^^ timestamp — los primeros 48 bits son la hora
v7 está siendo adoptado rápidamente como sucesor de v4 en sistemas nuevos.
v1 — basado en MAC + timestamp (legado)
Generado con la dirección MAC del equipo y la hora. Evítalo en sistemas nuevos — expone la dirección MAC y genera colisiones si varios procesos crean IDs al mismo tiempo.
UUID vs otros sistemas de ID
| Sistema | Ejemplo | Coordinación central | Ordenable |
|---|---|---|---|
| Auto-increment (SQL) | 1, 2, 3 | Sí (base de datos) | Sí |
| UUID v4 | 9b1deb4d-... | No | No |
| UUID v7 | 018f5b2a-... | No | Sí |
| ULID | 01ARZ3NDEKTSV4RRFFQ69G5FAV | No | Sí |
| NanoID | V1StGXR8_Z5jdHi6B-myT | No | No |
Los IDs auto-incrementales son más compactos y fáciles de leer, pero tienen dos problemas: exponen cuántos registros hay (/usuario/1 vs /usuario/137892) y no escalan bien en sistemas distribuidos donde varias instancias crean registros en paralelo.
Cuándo usar UUID
// ✅ Bien: IDs de recursos expuestos en URLs
const articulo = {
id: randomUUID(), // /articulos/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
titulo: 'Mi artículo'
};
// ✅ Bien: tokens de sesión, links de confirmación
const tokenReset = randomUUID();
// ✅ Bien: sistemas distribuidos donde varios servicios crean registros
// sin pasar por la misma base de datos
// ❌ Evitar: tablas de unión internas que nunca salen de la BD
// (auto-increment es más eficiente en joins)
En JavaScript / Node.js
Sin dependencias (Node.js 14.17+):
import { randomUUID } from 'node:crypto';
const id = randomUUID(); // UUID v4
Con el paquete uuid (si necesitas v7 u otras versiones):
npm install uuid
import { v4 as uuidv4, v7 as uuidv7 } from 'uuid';
uuidv4() // '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
uuidv7() // '018f5b2a-3c4d-7e2f-9a1b-0c5d6e7f8a9b' — ordenable
En el navegador (Web Crypto API):
const id = crypto.randomUUID(); // Disponible en todos los navegadores modernos
Validar un UUID
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
UUID_REGEX.test('550e8400-e29b-41d4-a716-446655440000') // true
UUID_REGEX.test('esto-no-es-un-uuid') // false