DEV Community

ToolRapido
ToolRapido

Posted on

Generando UUIDs en JavaScript: crypto.randomUUID() y todo lo que necesitas saber

UUID (Universally Unique Identifier) es el estándar para generar identificadores únicos sin coordinación entre sistemas. Aquí te explico todo lo que necesitas saber para usarlos correctamente en JavaScript.

La forma moderna: crypto.randomUUID()

Desde 2022, todos los navegadores modernos y Node.js 14.17+ tienen crypto.randomUUID() nativo:

crypto.randomUUID();
// 'f47ac10b-58cc-4372-a567-0e02b2c3d479'
Enter fullscreen mode Exit fullscreen mode

Es criptográficamente seguro, rápido y no requiere ninguna librería. Úsalo siempre que puedas.

Implementación manual de UUID v4

Si necesitas soporte para entornos sin crypto.randomUUID() o quieres entender cómo funciona:

function uuidv4() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

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

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

  const hex = Array.from(bytes, (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).join(''),
  ].join('-');
}
Enter fullscreen mode Exit fullscreen mode

¿Cuándo hay colisiones?

UUID v4 tiene 122 bits de aleatoriedad (los otros 6 son fijos por la especificación). La probabilidad de colisión es:

  • Con 1 millón de UUIDs: probabilidad de colisión ≈ 0.000000000001%
  • Para tener 50% de probabilidad de colisión necesitarías generar 2.71 × 10^18 UUIDs

En la práctica, las colisiones son imposibles. No necesitas verificar unicidad en base de datos salvo en sistemas con millones de registros por segundo durante años.

UUID vs ULID vs NanoID

// UUID v4 — estándar universal, desordenado
'f47ac10b-58cc-4372-a567-0e02b2c3d479'  // 36 chars

// ULID — ordenable por tiempo (útil como PK en bases de datos)
'01ARZ3NDEKTSV4RRFFQ69G5FAV'           // 26 chars

// NanoID — más corto, URL-safe
'V1StGXR8_Z5jdHi6B-myT'               // 21 chars (configurable)
Enter fullscreen mode Exit fullscreen mode

Para claves primarias en bases de datos, ULID es mejor que UUID porque es ordenable y más eficiente en índices B-tree. Para identificadores públicos en URLs, NanoID es más compacto.

UUID como clave primaria en PostgreSQL

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email TEXT NOT NULL
);
Enter fullscreen mode Exit fullscreen mode

En PostgreSQL 13+ gen_random_uuid() es nativo. En versiones anteriores necesitas la extensión pgcrypto.

Validar un UUID

function isValidUUID(str) {
  return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str);
}

isValidUUID('f47ac10b-58cc-4372-a567-0e02b2c3d479'); // true
isValidUUID('not-a-uuid');                            // false
Enter fullscreen mode Exit fullscreen mode

Herramienta online

Si necesitas generar UUIDs rápidamente para pruebas o desarrollo, puedes usar este generador de UUID gratuito que funciona en el navegador.

Conclusión

  • Usa crypto.randomUUID() siempre que sea posible — es nativo, seguro y rápido
  • Las colisiones son prácticamente imposibles, no las gestiones en código
  • Para PKs en bases de datos considera ULID si el orden importa
  • UUID v4 es el estándar universal: úsalo cuando necesites interoperabilidad

Top comments (0)