Generar UUIDs en JavaScript: crypto.randomUUID y los paquetes npm legacy
Si tu runtime es de los últimos tres años, ya no necesitas el paquete `uuid`. `crypto.randomUUID()` viene de serie, cumple RFC y es más rápido.
crypto.randomUUID basta hoy
crypto.randomUUID() es parte de la Web Crypto API y del módulo crypto de Node.js. Devuelve un UUIDv4 conforme a RFC 9562 generado con el CSPRNG de la plataforma.
En el navegador:
``js
const id = crypto.randomUUID();
// → "1a2b3c4d-5e6f-4a8b-9c0d-1e2f3a4b5c6d"
``
En Node 14.17+ con crypto global (desde Node 19) o vía import { randomUUID } from "node:crypto". Las dos rutas son funcionalmente idénticas y entre 5 y 10 veces más rápidas que el paquete uuid histórico porque no hay seed de RNG a nivel JS.
Cuándo aún necesitas el paquete uuid
Dos razones válidas para mantener uuid como dependencia:
Necesitas una versión distinta a la v4. El paquete soporta v1, v3, v5, v6, v7. crypto.randomUUID() solo hace v4.
Soportas runtimes muy viejos. Internet Explorer está muerto, pero si tu bundler targetea %5% o navegadores antiguos, crypto.randomUUID puede no estar definido. uuid trae polyfill.
Para todo lo demás, la dependencia es peso muerto.
UUIDv7 en JavaScript puro
UUIDv7 es el formato moderno con timestamp de milisegundos embebido. El paquete oficial uuid lo soporta desde la versión 9.0:
import { v7 } from "uuid";
const id = v7();
// → "0192d80f-c0a3-7f3a-8e0b-1234567890ab"
Si no quieres dependencia puedes implementar v7 a mano en 15 líneas: coges el epoch ms como 48 bits, fijas el nibble de versión a 7, fijas el nibble de variant a "10", rellenas el resto con crypto.getRandomValues. El RFC 9562 oficial tiene el layout de bits.
¿Y nanoid?
nanoid es otro animal. Genera un ID URL-safe de 21 caracteres con resistencia a colisiones similar a UUIDv4 pero en forma más compacta. Si tus IDs son de cara al usuario en URLs y los quieres más cortos, gana nanoid. Si son claves de base de datos y el consumidor espera formato UUID, te quedas con UUID.
Ejemplo completo
javascript// Navegador o Node 19+
const id = crypto.randomUUID();
console.log(id);
// → "1a2b3c4d-5e6f-4a8b-9c0d-1e2f3a4b5c6d"
// Node 14.17 a 18: import explícito
import { randomUUID } from "node:crypto";
console.log(randomUUID());
// En lote
const ids = Array.from({ length: 100 }, () => crypto.randomUUID());
// UUIDv7 vía el paquete oficial de npm
import { v7 } from "uuid";
console.log(v7()); ¿Solo necesitas el resultado?
Cuando necesitas un UUID fuera de un runtime JS, tipo poblar a mano un archivo de configuración o coger uno para un test rápido, el generador online en el navegador te da el mismo valor conforme con RFC con un click y sin instalar nada.
Abrir Generador de UUID v4 →Preguntas frecuentes
¿Es seguro usar crypto.randomUUID en el navegador?
Sí. Llama al CSPRNG de la plataforma y está disponible en todos los navegadores desde 2023 (Safari 15.4, Chrome 92, Firefox 95). Para navegadores antiguos usa el paquete uuid como polyfill.
¿Puedo generar un UUID sin crypto, usando Math.random?
Puedes pero no deberías. Math.random no es criptográficamente seguro y un atacante motivado puede predecir las salidas. Usa siempre crypto.randomUUID, crypto.getRandomValues o una librería bien semillada.
¿Son crypto.randomUUID y uuid.v4() compatibles en salida?
Sí. Los dos producen un string UUIDv4 en la forma canónica hex 8-4-4-4-12 con el nibble de versión 4. Quien los lee no distingue uno del otro.