cv.cm

Conocimientos · Texto, datos y seguridad

¿Qué es un UUID?

4 min de lectura

Respuesta corta

Un UUID (identificador único universal) es un número de 128 bits que sirve para etiquetar datos sin que una autoridad central reparta los identificadores. Se escribe como 32 dígitos hexadecimales en cinco grupos, como f47ac10b-58cc-4372-a567-0e02b2c3d479. El estándar actual, RFC 9562, define varias versiones; la versión 4 es totalmente aleatoria y la versión 7 empieza con una marca de tiempo, de modo que los identificadores se ordenan por fecha de creación.

Abrir Generador de UUID

Cómo leer un UUID

La forma de texto tiene 36 caracteres: 32 dígitos hexadecimales más 4 guiones, agrupados 8-4-4-4-12. En binario ocupa 16 bytes. Dos posiciones llevan metadatos en todos los UUID:

  • Versión: el primer dígito del tercer grupo. En f47ac10b-58cc-4372-a567-0e02b2c3d479 es 4.
  • Variante: el primer dígito del cuarto grupo. En los UUID estándar es 8, 9, a o b; aquí es a.

GUID, el nombre que usa Microsoft para lo mismo, sigue el mismo formato. Las mayúsculas y minúsculas hexadecimales son equivalentes; RFC 9562 recomienda generar en minúsculas y aceptar la entrada sin distinguir mayúsculas. Existen dos valores especiales: el Nil UUID, todo ceros, y el Max UUID, todo f.

Versiones de UUID

RFC 9562, publicado en mayo de 2024, sustituyó a RFC 4122, mantuvo las versiones 1 a 5 y añadió la 6, la 7 y la 8.

VersiónSe construye a partir deOrdenable por tiempoUso típico
1Marca de tiempo (intervalos de 100 ns desde 1582) + secuencia de reloj + ID de nodo, a menudo una dirección MACNo como textoSistemas heredados
3Hash MD5 de un espacio de nombres y un nombreNoIdentificadores deterministas (mejor v5)
4122 bits aleatoriosNoIdentificadores de uso general
5Hash SHA-1 de un espacio de nombres y un nombreNoLa misma entrada siempre da el mismo UUID
6Campos de la versión 1 reordenados, con la parte más significativa del tiempo primeroSíMigración desde v1
7Tiempo Unix de 48 bits en milisegundos + bits aleatoriosSíClaves de base de datos, logs, eventos
8Estructura personalizada, definida por el proveedorDependeUsos experimentales o específicos de una aplicación

Las versiones 3 y 5 son deterministas: aplicar el hash al espacio de nombres DNS con example.com da el mismo UUID en cualquier máquina. Usan MD5 y SHA-1 solo como forma de repartir los bits, no por seguridad.

Versión 4 vs versión 7

BitsVersión 4Versión 7
0–47AleatoriosMarca de tiempo Unix en milisegundos
48–51Versión 0100 (4)Versión 0111 (7)
52–63AleatoriosAleatorios, o un contador de submilisegundos
64–65Variante 10Variante 10
66–127AleatoriosAleatorios
Bits aleatorios122Hasta 74

El ejemplo de versión 7 del RFC es 017f22e2-79b0-7cc3-98c4-dc0c0c07398f. Sus primeros 12 dígitos hexadecimales, 017f22e279b0, equivalen a 1,645,557,742,000 milisegundos desde la época Unix, es decir, 2022-02-22 19:22:22 UTC.

La diferencia práctica está en el rendimiento de la base de datos. Las claves v4 aleatorias caen en puntos aleatorios de un índice B-tree, lo que divide páginas y reparte las escrituras por todo el índice. Las claves v7, ordenadas por tiempo, se añaden cerca del final, como un entero autoincremental, lo que mantiene las inserciones rápidas y el índice compacto. Para nuevas claves primarias de base de datos, v7 suele ser la mejor opción; para tokens opacos en los que no debe verse la fecha de creación, usa v4.

¿Hasta qué punto es único?

Con 122 bits aleatorios hay unos 5.3 × 10^36 UUID de versión 4 posibles. Según la cota del cumpleaños, harían falta unos 2.7 × 10^18 antes de que la probabilidad de una sola colisión llegue al 50 %. Generando mil millones por segundo, eso lleva unos 86 años.

Las colisiones reales vienen de una mala aleatoriedad, no de las matemáticas. Una máquina virtual clonada con el mismo estado aleatorio, o un generador basado en una función no criptográfica como Math.random(), pueden repetir valores. Usa una fuente criptográficamente segura: crypto.randomUUID() en navegadores y Node.js, uuid.uuid4() en Python o gen_random_uuid() en PostgreSQL.

Cómo almacenar UUID

  • Usa un tipo nativo si existe, como uuid en PostgreSQL: 16 bytes en lugar de 36 como texto.
  • En MySQL, guárdalo como BINARY(16); guardarlo como texto duplica con creces el tamaño del índice.
  • Compara los UUID sin distinguir mayúsculas, o normalízalos a minúsculas al recibirlos.
  • No intentes extraer significado de los UUID v4. Solo los bits de versión y variante contienen información.

Preguntas frecuentes

¿Qué diferencia hay entre un UUID y un GUID?

En la práctica, ninguna. GUID es el nombre que usa Microsoft, y los GUID siguen el mismo formato de 128 bits y las mismas versiones que los UUID.

¿Pueden coincidir dos UUID?

En teoría, sí; en la práctica, no si se generan con una fuente aleatoria segura. La probabilidad de cualquier colisión sigue siendo despreciable hasta que existen mucho más de un trillón de UUID de versión 4.

¿Qué versión de UUID debo usar?

La versión 7 para claves de base de datos y todo lo que se beneficie del orden temporal, la versión 4 cuando el identificador no deba revelar nada y la versión 5 cuando la misma entrada deba producir siempre el mismo identificador.

¿Cómo genero un UUID en JavaScript?

Llama a crypto.randomUUID(), que devuelve un UUID de versión 4 desde un generador criptográficamente seguro. Funciona en los navegadores modernos en páginas HTTPS y en Node.js 19 y posteriores como función global.

Todos los artículos