Qué es un UUID, en cristiano
Un UUID es una cadena larga con pinta aleatoria diseñada para ser única sin que nadie tenga que coordinar. Dos sistemas, en dos continentes, con dos segundos de diferencia, generan un UUID cada uno y puedes confiar en que los dos valores no van a chocar.
El formato son 32 dígitos hexadecimales con cuatro guiones para que se lea mejor:
550e8400-e29b-41d4-a716-446655440000
La aleatoriedad tiene que ser de verdad. Si dos UUIDs chocan, dos registros que deberían ser distintos acaban etiquetados igual, tu base de datos explota, y pasas la tarde depurando algo que no tendría que haber pasado.
El problema con el código viejo
Hace cinco años, generar un UUID en el navegador significaba meter uuid desde npm o copiar una función de Stack Overflow. La función tenía esta pinta:
function uuidv4() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c => {
const r = Math.random() * 16 | 0;
const v = c == "x" ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
Funciona. También está mal, porque Math.random() no es criptográficamente seguro. Los valores que produce son lo bastante predecibles para que, en un contexto de seguridad, un atacante pueda adivinar qué UUIDs vas a generar luego.
Para IDs aleatorios en contextos sin seguridad (claves de caché, correlación de logs), la diferencia no importa mucho. Para tokens de sesión, URLs de reset de contraseña, cualquier cosa donde adivinar el próximo UUID le permita a un atacante forjar acceso, importa muchísimo.
La forma correcta en 2026
Todos los navegadores modernos tienen una función incorporada:
crypto.randomUUID();
// "550e8400-e29b-41d4-a716-446655440000"
Esa única línea reemplaza el paquete uuid entero de npm. Usa la aleatoriedad criptográfica del sistema operativo, produce un UUIDv4 con el formato correcto, y es la misma función que el propio navegador usa internamente.
La misma función existe en Node.js (crypto.randomUUID()) y en Deno. El patrón es universal en runtimes modernos de JavaScript.
Si tienes un codebase viejo que importa el paquete uuid solo para v4, puedes borrar la dependencia. El ahorro de descarga es minúsculo, pero el principio importa: deja de importar librerías para cosas que la plataforma hace gratis.
Cuando necesites un UUID sin escribir código, el generador de UUIDs de AldeaCode los produce en lote. Usa crypto.randomUUID() por debajo y corre en tu navegador, sin subida, sin log.
UUIDv7 y ULID: cuándo importan los IDs ordenados
UUIDv4 es totalmente aleatorio. Dos UUIDs generados con un milisegundo de diferencia no tienen nada en común. Esto es genial para que no se puedan adivinar, terrible para el rendimiento de base de datos.
Cuando insertas una fila con un ID aleatorio en un índice B-tree (la estructura que usa la mayoría de bases de datos), el ID aleatorio cae en algún punto medio del árbol. El árbol se rebalancea. Con millones de inserts, el rebalanceo domina.
El arreglo es una variante de UUID que incluye el timestamp actual al principio. Dos UUIDs generados cerca en el tiempo empiezan con prefijos parecidos, así que caen cerca en el índice.
Dos formatos hacen esto:
- UUIDv7 es la variante oficial de UUID para IDs ordenados por tiempo. Tiene pinta de UUID, con un timestamp en milisegundos codificado en la primera parte. La mayoría de bases lo reconocen como UUID.
- ULID es un formato no oficial que usa base32 en lugar de hex. Ordenable, más compacto (26 caracteres en lugar de 36), pero no es UUID según la spec estricta.
Para sistemas nuevos en 2026, usa UUIDv7 por defecto a menos que tengas una razón específica para ULID. La mayoría de lenguajes tienen generadores de UUIDv7 ya. La diferencia entre v4 y v7 en producción es real: los inserts de v7 en índices B-tree son varias veces más rápidos.
Cuándo añadir un salt
Los UUIDs son únicos pero no están autenticados. Si tu URL tiene un UUID, cualquiera puede cambiar un dígito y cargar la URL resultante.
Si el UUID apunta a un recurso público, está bien. Si apunta a datos privados (un reset de contraseña, un documento no listado), necesitas una comprobación extra en el servidor: este UUID pertenece a este usuario, sigue siendo válido, ha sido usado.
Para tokens de un solo uso, genera un UUID y guárdalo en el servidor con el usuario al que pertenece y una expiración. El UUID en sí no prueba nada, la fila de la base de datos que coincide con él sí.
Una rutina práctica para 2026
Para cualquier código nuevo: usa la plataforma crypto.randomUUID() y olvídate del paquete npm.
Para claves primarias de base de datos: prefiere UUIDv7 (o un int secuencial si tu conjunto de datos cabe en un nodo). La elección importa más de lo que la gente piensa, mira UUID o ID serial como clave primaria.
Para tokens que tienen que ser inadivinables: UUIDv4 respaldado por crypto.randomUUID(), combinado con validación en el servidor.
Para IDs ordenables que ven los usuarios: ULID si controlas ambos lados, UUIDv7 si quieres que parezca un UUID normal.
El generador de UUIDs, el generador de hash, y el convertidor de timestamps de AldeaCode manejan los casos comunes. Todos corren en tu navegador. La era de 2015 de meter una librería de UUIDs por una función ya pasó, la plataforma hace el trabajo y lo hace bien.