Generar UUID v4 en JavaScript — Guía completa

·TypeScript & Full-stack Developer·Revisado porMarcus Webb·Publicado

Usa el Generador UUID v4 gratuito directamente en tu navegador — sin instalación.

Probar Generador UUID v4 online →

Toda aplicación JavaScript necesita eventualmente identificadores únicos — tokens de sesión, filas de base de datos, claves de idempotencia para APIs de pago, IDs de correlación para trazado distribuido. La forma más sencilla de generar UUID v4 en JavaScript hoy es crypto.randomUUID(): cero dependencias, una línea, criptográficamente seguro. UUID v4 se usa ampliamente precisamente porque no necesita coordinación entre servicios — cliente y servidor pueden producir IDs de forma independiente sin riesgo de colisiones. Esta guía cubre esa API integrada, el paquete uuid de npm, validación — todo en Node.js 19+ y navegadores modernos. Para una opción sin código, el Generador UUID v4 en ToolDeck produce identificadores conformes al instante.

  • crypto.randomUUID() está integrado en navegadores y Node.js — cero dependencias, una línea de código.
  • UUID v4 es un identificador aleatorio de 128 bits: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y es 8, 9, a o b).
  • Valida con /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i — comprueba los bits de versión y variante.
  • El paquete uuid de npm añade soporte para v1, v3, v5 y v7 cuando necesitas más que IDs aleatorios.
  • Para claves primarias de base de datos, prefiere UUID v7 (ordenado por tiempo) sobre v4 (aleatorio) para reducir la fragmentación del índice.

¿Qué es UUID v4?

Un UUID (Identificador Universalmente Único) versión 4 es un identificador aleatorio de 128 bits formateado como 32 dígitos hexadecimales separados por cuatro guiones: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. El 4 en la posición 15 marca la versión. El carácter y en la posición 20 es uno de 8, 9, a o b (la variante RFC 4122). Los 122 bits restantes son aleatorios. UUID v4 es la versión más común en aplicaciones JavaScript porque no requiere coordinación entre sistemas — puedes generar IDs de forma independiente en cliente y servidor sin preocuparte por las colisiones.

Before · javascript
After · javascript
// Sin identificador
const event = { action: "user.login", ts: 1711824000 };
// Con UUID v4
const event = {
  id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  action: "user.login",
  ts: 1711824000
};

crypto.randomUUID() — El Enfoque Nativo de JavaScript

crypto.randomUUID() está disponible en Chrome 92+, Firefox 95+, Safari 15.4+ y Node.js 19+ (con soporte experimental desde Node.js 14.17.0 a través de globalThis.crypto). Devuelve una cadena UUID v4 de 36 caracteres en minúsculas. No se necesita import en JavaScript de navegador. En Node.js, puedes llamarlo directamente en el objeto global cryptoo importarlo explícitamente desde el módulo node:crypto.

JavaScript — navegador (sin imports)
// Funciona en cualquier navegador moderno — sin build step, sin bundler
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

// Úsalo donde necesites un identificador único
const telemetryEvent = {
  event_id: crypto.randomUUID(),
  action: "checkout.started",
  session_id: crypto.randomUUID(),
  timestamp: Date.now(),
  cart_total_cents: 14999,
};
console.log(JSON.stringify(telemetryEvent, null, 2));
Node.js — dos enfoques equivalentes
// Enfoque 1: crypto global (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// Enfoque 2: import explícito desde node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"

Detectar la característica de crypto.randomUUID vale la pena si tu código podría ejecutarse en navegadores más antiguos o WebViews embebidos. La comprobación es una sola guarda typeof:

JavaScript — detección de características con fallback
function generateUUIDv4() {
  // Preferir la API nativa cuando esté disponible
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  // Fallback manual usando getRandomValues (ver sección siguiente)
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Establecer versión (4) y variante (RFC 4122)
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return [
    hex.slice(0, 4).join(''),
    hex.slice(4, 6).join(''),
    hex.slice(6, 8).join(''),
    hex.slice(8, 10).join(''),
    hex.slice(10, 16).join(''),
  ].join('-');
}

console.log(generateUUIDv4());
// "9b2e4f1a-7c3d-4e8f-a5b6-0d2c1e9f8a7b"
Nota:En contextos seguros (páginas HTTPS, localhost, extensiones de navegador), crypto.randomUUID() siempre está disponible. Lanza un error en páginas HTTP no seguras en algunos navegadores. Si tu aplicación alguna vez se ejecuta en HTTP plano durante el desarrollo, el fallback con getRandomValues anterior gestiona ese caso.

Generar UUID v4 Sin una Librería

A veces no puedes depender de crypto.randomUUID() — quizás estás apuntando a un WebView que elimina la API crypto, o necesitas entender qué ocurre por debajo. El enfoque manual usa crypto.getRandomValues() (disponible desde IE 11) para rellenar 16 bytes con datos aleatorios, luego aplica dos operaciones de máscara de bits para establecer los campos de versión y variante. Estas dos operaciones son la única diferencia entre UUID v4 y una cadena de bytes puramente aleatoria.

JavaScript — UUID v4 manual con getRandomValues
function uuidv4Manual() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Establecer versión: bits 12–15 del byte 6 = 0100 (versión 4)
  bytes[6] = (bytes[6] & 0x0f) | 0x40;

  // Establecer variante: bits 6–7 del byte 8 = 10 (RFC 4122)
  bytes[8] = (bytes[8] & 0x3f) | 0x80;

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));

  return (
    hex.slice(0, 4).join('') + '-' +
    hex.slice(4, 6).join('') + '-' +
    hex.slice(6, 8).join('') + '-' +
    hex.slice(8, 10).join('') + '-' +
    hex.slice(10, 16).join('')
  );
}

const traceId = uuidv4Manual();
console.log(traceId);
// "e4d7c2a1-3f9b-48e5-a612-9d8c7b6a5f4e"

// Verificar que pasa la validación UUID v4
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
console.log(UUID_V4_RE.test(traceId)); // true
Advertencia:Nunca uses Math.random() para generar UUIDs. No es criptográficamente seguro, su período de salida es demasiado corto, y algunos motores producen secuencias predecibles. Usa siempre crypto.getRandomValues() o crypto.randomUUID().

El Paquete uuid de npm — Soporte Multi-Versión

El paquete uuid en npm ha sido la librería UUID de referencia para JavaScript desde antes de que crypto.randomUUID() existiera. Sigue teniendo sentido en tres situaciones: necesitas versiones UUID distintas a v4 (v1, v3, v5, v7), apuntas a runtimes anteriores a Node.js 14.17.0, o quieres las funciones de utilidad validate y parse. Para UUID v4 simple en un runtime moderno, la API nativa es suficiente y yo omitiría la dependencia.

bash — instalar
npm install uuid
JavaScript — paquete uuid para generación de v4
import { v4 as uuidv4, validate, version } from 'uuid';

// Generar un UUID v4
const paymentId = uuidv4();
console.log(paymentId);
// "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"

// Validar cualquier cadena UUID
console.log(validate(paymentId));    // true
console.log(validate("not-a-uuid")); // false

// Detectar la versión de un UUID
console.log(version(paymentId));     // 4

// Generar un lote para sembrar una base de datos de prueba
const testAccounts = Array.from({ length: 5 }, () => ({
  account_id: uuidv4(),
  plan: "starter",
  created_at: new Date().toISOString(),
}));
console.log(testAccounts);
Nota:El paquete uuid usa internamente crypto.getRandomValues() en navegadores y crypto.randomBytes() en Node.js, por lo que la fuente de entropía es idéntica a la API nativa. La diferencia son solo las funciones de utilidad adicionales y el soporte multi-versión.

Si prefieres no escribir código en absoluto, prueba el Generador UUID v4 — genera identificadores v4 conformes a RFC 4122 directamente en tu navegador con un solo clic.

UUIDs Deterministas — Generando UUID v5 a Partir de una Cadena

UUID v4 es aleatorio por definición — llamarlo dos veces siempre da resultados diferentes. A veces necesitas lo contrario: la misma cadena de entrada siempre debe producir el mismo UUID. Eso es lo que hace UUID v5. Aplica un hash a un UUID de espacio de nombres y una cadena de entrada con SHA-1, luego formatea el resultado como un UUID. Mismo espacio de nombres + misma entrada = misma salida, siempre, en cualquier máquina. Esto es útil para derivar IDs estables a partir de URLs, direcciones de correo electrónico o cualquier cadena que ya identifique un recurso.

JavaScript — uuid v5 para IDs deterministas
import { v5 as uuidv5 } from 'uuid';

// Espacio de nombres integrado para URLs (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

// La misma URL siempre produce el mismo UUID
const pageId1 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
const pageId2 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
console.log(pageId1 === pageId2); // true
console.log(pageId1);
// "a6e4e1c0-7e23-5d3b-8f14-9c2a1b3d5e7f"

// Espacio de nombres personalizado para tu aplicación
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"

Nota rápida: UUID v3 hace lo mismo pero con MD5 en lugar de SHA-1. Prefiere v5 para nuevos proyectos. MD5 tiene debilidades de colisión conocidas, y aunque eso no importa mucho para la generación de IDs, no hay razón para elegirlo sobre SHA-1 cuando ambos están disponibles.

Referencia de crypto.randomUUID() y APIs Relacionadas

El nativo crypto.randomUUID() no toma argumentos — devuelve una cadena y nada más. Úsalo cuando necesites identificadores conformes a RFC 4122 con cero dependencias. Cuando necesites bytes aleatorios sin procesar en lugar de una cadena UUID formateada — por ejemplo, para rellenar un array tipado o derivar una clave — recurre a crypto.getRandomValues() directamente. Las APIs relacionadas que importan para el trabajo con UUID se enumeran a continuación.

Propiedad / Método
Tipo de retorno
Descripción
crypto.randomUUID()
string
Devuelve una cadena UUID v4 de 36 caracteres en hexadecimal minúsculo con guiones
crypto.getRandomValues(arr)
TypedArray
Rellena un array tipado con valores aleatorios criptográficamente seguros — el bloque fundamental para la generación manual de UUID
URL.createObjectURL(blob)
string
Genera una URL de blob única (no es un UUID, pero a veces se confunde con uno)

Desglose del patrón regex para UUID v4:

Segmento
Patrón
Significado
[0-9a-f]{8}
xxxxxxxx
Primeros 8 dígitos hex — 32 bits aleatorios
[0-9a-f]{4}
xxxx
Siguientes 4 dígitos hex — 16 bits aleatorios
4[0-9a-f]{3}
4xxx
Nibble de versión fijo en 4, seguido de 12 bits aleatorios
[89ab][0-9a-f]{3}
yxxx
El nibble de variante es 8, 9, a o b — seguido de 12 bits aleatorios
[0-9a-f]{12}
xxxxxxxxxxxx
Últimos 12 dígitos hex — 48 bits aleatorios

Validar UUID v4 con Regex

Validar que una cadena es un UUID v4 correcto surge constantemente — cuerpos de solicitudes API entrantes, parámetros URL, cargas de webhook. Una regex hecha a mano es la elección correcta cuando quieres cero dependencias y solo estás validando v4. Si ya estás usando el paquete uuid, prefiere su exportación validate() — maneja todas las versiones UUID y es menos propenso a errores que mantener un patrón personalizado. La regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i comprueba tanto el nibble de versión (debe ser 4) como el nibble de variante (debe ser 8, 9, a o b). Usa RegExp.prototype.test() para comprobaciones booleanas y .match() cuando necesites extraer un UUID del texto circundante.

JavaScript — helper de validación UUID v4
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

function isUUIDv4(str) {
  return UUID_V4_RE.test(str);
}

// UUID v4 válido
console.log(isUUIDv4("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d")); // true

// UUID v1 — el nibble de versión es 1, no 4
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false

// UUID v7 — el nibble de versión es 7
console.log(isUUIDv4("018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b")); // false

// Cadenas malformadas
console.log(isUUIDv4("not-a-uuid"));           // false
console.log(isUUIDv4(""));                      // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (sin guiones)

// Extraer UUID de una cadena más larga
const logLine = 'Request req_id=9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d failed with 503';
const match = logLine.match(/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i);
console.log(match?.[0]);
// "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

Generar y Adjuntar UUIDs desde Archivo y Respuesta de API

En la práctica, raramente llamas a crypto.randomUUID() de forma aislada. Dos patrones surgen constantemente: asignar IDs a registros antes de escribirlos en una base de datos, y adjuntar IDs de correlación a solicitudes API salientes para poder rastrear una solicitud a través de servicios en tus logs.

Leer Archivo NDJSON → Asignar UUIDs → Escribir de Vuelta

Node.js — asignar UUIDs a registros desde un archivo
import { readFileSync, writeFileSync } from 'node:fs';
import { randomUUID } from 'node:crypto';

function assignIds(inputPath, outputPath) {
  const lines = readFileSync(inputPath, 'utf-8')
    .split('\n')
    .filter(line => line.trim());

  const records = lines.map(line => {
    try {
      const record = JSON.parse(line);
      if (!record.id) {
        record.id = randomUUID();
      }
      return JSON.stringify(record);
    } catch (err) {
      console.error(`Skipping malformed line: ${err.message}`);
      return null;
    }
  }).filter(Boolean);

  writeFileSync(outputPath, records.join('\n') + '\n');
  console.log(`Assigned IDs to ${records.length} records → ${outputPath}`);
}

assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// Assigned IDs to 1284 records → warehouse-products-with-ids.ndjson

Adjuntar ID de Correlación a Solicitud API Saliente

Node.js — ID de correlación para trazado distribuido
import { randomUUID } from 'node:crypto';

async function createShipment(orderPayload) {
  const correlationId = randomUUID();

  try {
    const response = await fetch('https://api.logistics.dev/v2/shipments', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-Correlation-ID': correlationId,
        'X-Idempotency-Key': randomUUID(),
      },
      body: JSON.stringify(orderPayload),
    });

    if (!response.ok) {
      const errorBody = await response.text();
      throw new Error(`Shipment API returned ${response.status}: ${errorBody}`);
    }

    const result = await response.json();
    console.log(`Shipment created: ${result.shipment_id} (correlation: ${correlationId})`);
    return result;
  } catch (err) {
    console.error(`[correlation:${correlationId}] Shipment failed: ${err.message}`);
    throw err;
  }
}

await createShipment({
  order_id: "ord_8a3f91bc",
  destination: { city: "Buenos Aires", state: "CABA", zip: "C1000" },
  items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});

Generación de UUID desde la Línea de Comandos

No siempre necesitas un script. Node.js puede generar un UUID directamente desde la línea de comandos, lo que es útil para scripts de shell, pipelines de CI y pruebas ad-hoc rápidas. El flag -eevalúa una expresión única.

bash — generar UUID desde la línea de comandos
# Un solo UUID
node -e "console.log(crypto.randomUUID())"
# 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f

# Cinco UUIDs a la vez
node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())"

# Generar y asignar a una variable de shell
export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())")
echo "Request ID: $REQUEST_ID"

# Usar npx uuid (si tienes el paquete instalado globalmente o quieres uno puntual)
npx uuid v4
# 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
bash — generar UUID en la consola del navegador (sin Node.js)
# Abre la consola de DevTools de cualquier navegador y escribe:
crypto.randomUUID()
# "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
Nota:Si necesitas UUIDs en un pipeline de CI y Node.js no está disponible, uuidgen está preinstalado en macOS y la mayoría de distribuciones Linux. Genera UUID v4 por defecto en sistemas modernos.

Alternativa de Alto Rendimiento — nanoid

Si estás generando miles de IDs por segundo y el formato UUID de 36 caracteres no es un requisito estricto, considera nanoid. Es 2x más rápido que uuid.v4(), produce un ID URL-safe de 21 caracteres por defecto, y pesa aproximadamente 1 KB tras la minificación. La salida no es un UUID — es un ID de alfabeto personalizado — así que no lo uses donde se requiera conformidad RFC 4122 (columnas UUID de base de datos, APIs que validan formato UUID, IDs de traza OpenTelemetry). Pero para IDs de correlación internos, claves de componentes React y slugs de URL, es una buena opción.

bash — instalar nanoid
npm install nanoid
JavaScript — nanoid para IDs únicos cortos
import { nanoid, customAlphabet } from 'nanoid';

// Por defecto: ID URL-safe de 21 chars (A-Za-z0-9_-)
const trackingCode = nanoid();
console.log(trackingCode);
// "V1StGXR8_Z5jdHi6B-myT"

// Longitud personalizada
const shortCode = nanoid(10);
console.log(shortCode);
// "IRFa-VaY2b"

// Alfabeto personalizado — solo números, 12 dígitos
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"

// Alfabeto personalizado — solo hex, 32 chars (misma entropía que UUID v4 sin guiones)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"

Salida de Terminal con Resaltado de Sintaxis

Depurar aplicaciones con muchos UUID significa mirar paredes de cadenas hexadecimales en el terminal. El código de colores ayuda. La librería chalk (o el más nuevo node:util styleText integrado en Node.js 21.7+) te permite resaltar UUIDs en la salida de logs para que destaquen del texto circundante.

Node.js — salida UUID con colores usando chalk
import chalk from 'chalk';
import { randomUUID } from 'node:crypto';

function logEvent(action, metadata = {}) {
  const eventId = randomUUID();
  const timestamp = new Date().toISOString();

  console.log(
    chalk.gray(timestamp),
    chalk.cyan(eventId),
    chalk.white(action),
    Object.keys(metadata).length
      ? chalk.dim(JSON.stringify(metadata))
      : ''
  );
}

logEvent('shipment.created', { order_id: 'ord_8a3f', carrier: 'fedex' });
logEvent('payment.captured', { amount_cents: 14999, currency: 'USD' });
logEvent('webhook.delivered', { endpoint: 'https://hooks.acme.dev/orders' });
// 2026-03-27T10:15:00.000Z  a1b2c3d4-...  shipment.created  {"order_id":"ord_8a3f",...}
Advertencia:Los códigos de escape de color corrompen los archivos de log y rompen los parsers JSON. Usa chalk o styleText solo para la salida de terminal que un humano lee directamente. Para logs estructurados que van a un archivo o agregador de logs, usa JSON plano.

Generar IDs Únicos Cortos en JavaScript

Un UUID de 36 caracteres a veces es demasiado largo — slugs de URL, datos de código QR, mensajes SMS y protocolos de hardware embebido tienen restricciones de longitud.

JavaScript — tres técnicas para IDs más cortos
import { randomUUID } from 'node:crypto';

// 1. Eliminar guiones del UUID v4 → cadena hex de 32 chars
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 chars)

// 2. Codificar en Base64 16 bytes aleatorios → cadena de 22 chars (URL-safe)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const base64Id = Buffer.from(bytes)
  .toString('base64url')
  .replace(/=+$/, '');
console.log(base64Id);
// "Pj8akksNTY6fEnarPIvR" (22 chars, 128 bits de entropía)

// 3. nanoid con longitud personalizada
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 chars, ~71 bits de entropía)

Los cálculos de probabilidad de colisión: un nanoid de 12 caracteres (alfabeto por defecto de 64 caracteres) ofrece aproximadamente 71 bits de entropía. A 1.000 IDs por segundo, necesitarías aproximadamente 116 años para alcanzar una probabilidad de colisión del 1%. Para la mayoría de las aplicaciones, eso es más que suficiente. Si estás generando millones de IDs por día, quédate con el UUID completo o usa nanoid con al menos 21 caracteres.

UUID v7 — Alternativa Ordenada por Tiempo a v4

UUID v7 (definido en RFC 9562) embebe una marca de tiempo Unix de 48 bits en milisegundos en el primer segmento, seguido de bits aleatorios. El resultado es un UUID que se parece a v4 pero se ordena cronológicamente. Esto lo convierte en una mejor opción que v4 para claves primarias de base de datos: las nuevas filas siempre caen al final del índice B-tree en lugar de en posiciones aleatorias, lo que reduce las divisiones de páginas y la fragmentación. En proyectos donde necesito IDs ordenados por tiempo para una tabla de Postgres, cambio a v7 inmediatamente — la diferencia de rendimiento del índice es medible a escala. El Generador UUID v7 en ToolDeck muestra la marca de tiempo embebida para cualquier UUID v7.

JavaScript — UUID v7 con el paquete uuid
import { v7 as uuidv7 } from 'uuid';

// Generar tres valores UUID v7 — observa que se ordenan cronológicamente
const id1 = uuidv7();
const id2 = uuidv7();
const id3 = uuidv7();

console.log(id1);
// "018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b"
console.log(id2);
// "018e4a0c-5b40-7e34-9c2d-1e4f5a6b7c8d"
console.log(id3);
// "018e4a0c-5b41-7f56-ae3f-2a5b6c7d8e9f"

// Se ordenan lexicográficamente por tiempo de creación
console.log([id3, id1, id2].sort());
// [id1, id2, id3] — orden cronológico preservado

// Usar v4 para tokens donde no debe filtrarse información de tiempo
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // completamente aleatorio, sin info de tiempo
Nota:El paquete uuid soporta v7 desde la versión 9.0.0 en adelante. Si estás en una versión anterior, ejecuta npm install uuid@latest para actualizar.

UUID v4 en el Navegador Sin un Build Step

Sin bundler, sin npm, sin transpilador. Solo un archivo HTML plano. Esta es la forma más sencilla posible de generar un UUID en JavaScript del lado del cliente. Funciona porque crypto.randomUUID() es una API de navegador integrada.

HTML — generador de UUID mínimo en navegador
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>UUID Generator</title></head>
<body>
  <p>Your UUID: <strong id="output"></strong></p>
  <button onclick="document.getElementById('output').textContent = crypto.randomUUID()">
    Generate
  </button>
  <script>
    // Generar uno al cargar la página
    document.getElementById('output').textContent = crypto.randomUUID();
  </script>
</body>
</html>

Eso es el archivo completo. Sin imports de CDN, sin etiquetas script que traigan librerías. Para algo más complejo — generación por lotes, validación, IDs deterministas — querrás el paquete uuid o el fallback manual mostrado anteriormente. Pero para un prototipo rápido o herramienta interna, esto es todo lo que necesitas.

Errores Comunes

He visto el patrón UUID con Math.random() copiado de publicaciones de blog antiguas en código de producción más veces de las que me gustaría admitir. Los bugs que introducen estos patrones son silenciosos: sin error en tiempo de ejecución, solo un comportamiento sutilmente incorrecto que aparece más tarde bajo carga o en revisiones de seguridad.

Usar Math.random() para generar UUIDs

Problema: Math.random() no es criptográficamente seguro. Su salida es predecible en algunos motores, y la baja entropía hace que las colisiones sean mucho más probables que con un CSPRNG adecuado.

Solución: Usa siempre crypto.randomUUID() o crypto.getRandomValues(). Ambos usan el CSPRNG del sistema operativo.

Before · JavaScript
After · JavaScript
// INSEGURO — predecible, baja entropía
function badUuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
    /[xy]/g,
    c => {
      const r = Math.random() * 16 | 0;
      return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    }
  );
}
// SEGURO — usa el CSPRNG del sistema operativo
const id = crypto.randomUUID();

// O si necesitas un fallback manual:
function secureUuid() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  bytes[6] = (bytes[6] & 0x0f) | 0x40;
  bytes[8] = (bytes[8] & 0x3f) | 0x80;
  const h = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return `${h.slice(0,4).join('')}-${h.slice(4,6).join('')}-${h.slice(6,8).join('')}-${h.slice(8,10).join('')}-${h.slice(10).join('')}`;
}
Comparar UUIDs con igualdad sensible a mayúsculas

Problema: crypto.randomUUID() devuelve hexadecimal en minúsculas, pero los UUIDs de otros sistemas (bases de datos, APIs, entrada de usuario) podrían usar mayúsculas. La comparación directa con === falla cuando los casos difieren.

Solución: Normaliza ambos lados a minúsculas antes de comparar.

Before · JavaScript
After · JavaScript
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // mayúsculas de la API
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";  // minúsculas de crypto

if (fromApi === local) { /* nunca se ejecuta */ }
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D";
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";

if (fromApi.toLowerCase() === local.toLowerCase()) {
  // coincide correctamente
}
Almacenar UUIDs como objetos en lugar de cadenas

Problema: Algunas librerías UUID (especialmente en otros lenguajes) devuelven objetos UUID. En JavaScript, envolver accidentalmente una cadena UUID en un objeto rompe las comprobaciones de igualdad, la serialización JSON y las consultas de base de datos.

Solución: Almacena y pasa siempre los UUIDs como cadenas simples. Si una librería devuelve un objeto, llama a .toString() o accede a la propiedad de cadena inmediatamente.

Before · JavaScript
After · JavaScript
// Creando un wrapper innecesario
class UUID {
  constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true, but...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}
// Simplemente usa una cadena
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}
Tratar UUID v4 como ordenable

Problema: UUID v4 es completamente aleatorio. Ordenar por UUID v4 da un orden arbitrario, no el orden de creación. Esto lleva a paginación impredecible, UIs de administración confusas y mal rendimiento del índice de base de datos.

Solución: Usa UUID v7 cuando necesites identificadores ordenados por tiempo. Mantén UUID v4 para tokens e IDs de correlación donde el orden de clasificación es irrelevante.

Before · JavaScript
After · JavaScript
// Mal: usar v4 como clave primaria ordenable
const rows = [
  { id: crypto.randomUUID(), created: "2026-03-27" },
  { id: crypto.randomUUID(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// El orden de clasificación es aleatorio — NO por fecha de creación
import { v7 as uuidv7 } from 'uuid';
// Bien: v7 se ordena por tiempo de creación
const rows = [
  { id: uuidv7(), created: "2026-03-27" },
  { id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// El orden de clasificación coincide con el tiempo de creación

crypto.randomUUID() vs uuid vs nanoid — Comparación Rápida

Método
Formato de salida
Versiones UUID
Tamaño del bundle
Tipos personalizados
Requiere instalación
crypto.randomUUID()
UUID v4 de 36 chars
Solo v4
0 KB
N/A
No (integrado)
paquete uuid npm
UUID de 36 chars
v1, v3, v4, v5, v6, v7
~6.5 KB
N/A
npm install
nanoid
ID URL-safe de 21 chars
Personalizado (no UUID)
~1 KB
N/A
npm install
Manual getRandomValues
UUID v4 de 36 chars
Solo v4
0 KB
N/A
No (integrado)
crypto.randomBytes (Node)
Buffer → UUID v4 de 36 chars
Solo v4
0 KB
N/A
No (integrado en Node)
paquete uuidv7 npm
UUID v7 de 36 chars
Solo v7
~2 KB
N/A
npm install

Para la mayoría de proyectos JavaScript: usa crypto.randomUUID() cuando solo necesites UUID v4 y tu runtime sea suficientemente reciente. Recurre al paquete uuid cuando necesites soporte para v5 (determinista) o v7 (ordenado por tiempo). Usa nanoid cuando un ID corto y URL-safe sea más práctico que un UUID de 36 caracteres — pero recuerda que la salida de nanoid no es conforme a UUID y fallará la validación en cualquier sistema que espere el formato RFC 4122.

Para una alternativa sin código, prueba el Generador UUID v4 para crear identificadores al instante en el navegador. Para inspeccionar un UUID existente, pégalo en el Decodificador de UUID para ver su versión, variante y cualquier dato de marca de tiempo embebida.

Preguntas Frecuentes

¿Cómo genero un UUID v4 en JavaScript?

Llama a crypto.randomUUID() en cualquier navegador moderno (Chrome 92+, Firefox 95+, Safari 15.4+) o Node.js 19+. Devuelve una cadena en minúsculas como "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f". No se necesita ningún import en navegadores porque crypto es un global incorporado; en Node.js también puedes usar import { randomUUID } from "node:crypto" para ser explícito sobre el módulo. Para runtimes anteriores a Node.js 19 puedes seguir llamando a crypto.randomUUID() en el global — estaba disponible de forma experimental desde Node.js 14.17.0. Si necesitas una opción sin código, el Generador de UUID v4 en /en/uuid/v4 produce identificadores conformes con un solo clic.

JavaScript
const sessionId = crypto.randomUUID();
console.log(sessionId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

¿Es crypto.randomUUID() criptográficamente seguro?

Sí. crypto.randomUUID() utiliza el mismo CSPRNG (generador de números pseudoaleatorios criptográficamente seguro) que respalda crypto.getRandomValues(). Los 122 bits aleatorios de un UUID v4 hacen que la probabilidad de colisión sea insignificante para todos los propósitos prácticos — necesitarías generar aproximadamente 2.71 quintillones de UUIDs antes de alcanzar un 50% de probabilidad de una sola colisión. La entropía proviene de la fuente aleatoria del sistema operativo (/dev/urandom en Linux, BCryptGenRandom en Windows), no de Math.random(), que explícitamente no es criptográficamente seguro. Esto significa que los valores UUID v4 son seguros para usar como tokens de sesión, tokens CSRF y otros identificadores sensibles a la seguridad donde debe evitarse la predictibilidad. Nunca sustituyas generadores de UUID basados en Math.random() en contextos de seguridad.

¿Puedo usar UUID v4 como clave primaria de base de datos?

Puedes, pero hay una compensación de rendimiento significativa. UUID v4 es completamente aleatorio, por lo que los índices B-tree se fragmentan mal porque cada nueva fila se inserta en una posición aleatoria del índice en lugar de al final. En tablas con muchas escrituras esto causa divisiones de página excesivas y fallos de caché, lo que degrada el rendimiento de INSERT y de los escaneos por rango. Si tu base de datos lo admite (PostgreSQL, MySQL 8.0+, SQL Server), UUID v7 (ordenado por tiempo) es una mejor clave primaria porque las nuevas filas siempre se añaden al final del índice. UUID v4 sigue siendo la elección correcta para tokens de sesión, parámetros de estado OAuth, claves de idempotencia, IDs de correlación y cualquier campo donde sea deseable ocultar el tiempo de creación.

JavaScript
// UUID v4 — aleatorio, no ordenable
const correlationId = crypto.randomUUID();

// UUID v7 — ordenado por tiempo, mejor para claves primarias de BD
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();

¿Cuál es la diferencia entre UUID v4 y UUID v7?

UUID v4 rellena 122 bits con datos aleatorios — cada segmento es efectivamente ruido. UUID v7 (RFC 9562, publicado en 2024) codifica una marca de tiempo Unix de 48 bits en milisegundos en el primer segmento, 12 bits de precisión submilisegundo en el segundo segmento, y bits aleatorios en el resto. Ambos tienen 128 bits en total y usan el mismo formato con guiones de 36 caracteres, por lo que son intercambiables a nivel de almacenamiento. UUID v7 es lexicográficamente ordenable por tiempo de creación, lo que mantiene los índices B-tree compactos y hace que las consultas por rango en ventanas de tiempo sean eficientes. Elige UUID v4 cuando el ID no debe revelar cuándo fue creado — por ejemplo, tokens de cara al público donde la información de tiempo podría ser explotada — y UUID v7 para claves primarias de base de datos, registros de auditoría y flujos de eventos donde el orden cronológico importa.

¿Cómo valido una cadena UUID v4 en JavaScript?

Comprueba con la regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i. El literal "4" en la posición 15 (indexado desde 0) confirma el nibble de versión; el carácter en la posición 20 — uno de 8, 9, a o b — codifica los bits de variante RFC 4122. Esta regex rechaza correctamente UUID v1, v7 y cualquier cadena malformada. El flag i la hace insensible a mayúsculas, por lo que los dígitos hexadecimales en mayúsculas de otros sistemas superan la validación sin normalización. Si solo necesitas saber si una cadena es algún UUID válido (independientemente de la versión), usa el patrón más permisivo /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i en su lugar.

JavaScript
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

UUID_V4_RE.test("550e8400-e29b-41d4-a716-446655440000"); // true
UUID_V4_RE.test("550e8400-e29b-11d4-a716-446655440000"); // false (v1)
UUID_V4_RE.test("not-a-uuid"); // false

¿Cómo genero un ID único corto en JavaScript?

Elimina los guiones de un UUID v4 para obtener una cadena hexadecimal de 32 caracteres: crypto.randomUUID().replaceAll("-", ""). Para algo aún más corto, usa nanoid que produce un ID URL-safe de 21 caracteres (A–Z, a–z, 0–9, _ y -) por defecto con resistencia a colisiones comparable a un UUID completo. La compensación es directa: los IDs más cortos tienen mayor probabilidad de colisión, pero nanoid con 21 caracteres sigue proporcionando 126 bits de entropía, lo que es más que suficiente para prácticamente todas las aplicaciones del mundo real. Para slugs de URL y cargas de código QR puedes llegar a tan solo 10–12 caracteres con nanoid antes de que la probabilidad de colisión se convierta en una preocupación a tasas de generación típicas. Evita codificar en Base64 un UUID sin procesar y truncarlo — el truncamiento destruye la independencia estadística de los bits y hace que las colisiones sean más difíciles de razonar.

JavaScript
// Cadena hex de 32 chars a partir de UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"

// ID URL-safe de 21 chars con nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"

Herramientas Relacionadas

También disponible en:Python
SL
Sophie LaurentTypeScript & Full-stack Developer

Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.

MW
Marcus WebbRevisor técnico

Marcus specialises in JavaScript performance, build tooling, and the inner workings of the V8 engine. He has spent years profiling and optimising React applications, working on bundler configurations, and squeezing every millisecond out of critical rendering paths. He writes about Core Web Vitals, JavaScript memory management, and the tools developers reach for when performance really matters.