Generador de UUID: v4, v7, v5 y listas en lote
Un buen generador de UUID te da la versión que tu base de datos necesita, escrita exactamente como la espera, y te dice qué es en realidad cualquier UUID que pegues. Todo lo de abajo se ejecuta en tu navegador.
Generador de UUID
Aún no hay nada. Los UUID generados se quedan solo en este navegador.
¿Qué versión debería darte un generador de UUID?
Todo UUID son 128 bits escritos como 32 dígitos hexadecimales en cinco grupos, 8-4-4-4-12. Dos de esos dígitos son de control: el 13.º es la versión y el 17.º lleva la variante (8, 9, a o b en los UUID de RFC 9562). Todo lo demás es lo que cada versión decide meter ahí: bits aleatorios, una marca de tiempo, un contador o un hash. Elegir la versión es, en realidad, elegir cuál de esas cosas quieres dentro de tu clave.
| Versión | Qué lleva dentro | Para qué usarla |
|---|---|---|
| v4 | 122 bits aleatorios | La opción segura por defecto: ID que no revelan nada, claves en tablas pequeñas y medianas, ID de correlación |
| v7 | Tiempo Unix de 48 bits en ms, luego contador y bits aleatorios | Claves primarias en tablas con mucha escritura, ID de eventos y logs que quieres ordenados por fecha de creación |
| v1 | Tiempo gregoriano en pasos de 100 ns, secuencia de reloj, nodo | Solo cuando un sistema heredado exige v1 |
| v6 | Los campos de v1, con el tiempo delante | Sistemas que ya hablan v1 pero necesitan claves ordenables |
| v5 | SHA-1 de espacio de nombres + nombre | El mismo ID cada vez para la misma entrada: una URL, un dominio, un SKU |
| v3 | MD5 de espacio de nombres + nombre | Coincidir con un sistema antiguo que ya usaba v3 |
| Nil / Max | Todo ceros / todo unos | Marcadores explícitos de «sin valor» y límites de rango, nunca como claves |
Mi regla práctica: v4, salvo que el ID sea una clave de base de datos con muchas inserciones; entonces, v7. La propia RFC 9562 dice que las implementaciones deberían usar v7 en lugar de v1 y v6 siempre que sea posible. El v5 basado en nombre es el raro del grupo: no va de unicidad en el tiempo, sino de obtener la misma respuesta dos veces, que es justo lo que quieres cuando dos servicios deben ponerse de acuerdo en el ID de "https://example.com/item/42" sin hablar entre ellos. La guía v4 vs v7 repasa la parte de los índices en esa decisión.
Un aviso práctico sobre v7: sus primeros 12 dígitos hexadecimales son el momento de creación en milisegundos, legible para cualquiera. Pega 017f22e2-79b0-7cc3-98c4-dc0c0c07398f en la pestaña Validar & decodificar y obtendrás el instante exacto en que se creó. Si un ID se muestra a los usuarios y el momento de creación es sensible, dales un v4.
Formatos: los mismos 128 bits, siete formas de escribirlos
La mayoría de los errores de «UUID no válido» que he perseguido no eran ID incorrectos, sino la forma de escritura equivocada para el sistema del otro lado. El generador de UUID conserva los bits y solo cambia el texto, así que el mismo valor puede ir en cualquiera de estos formatos:
| Formato | Ejemplo | Dónde se espera |
|---|---|---|
| Estándar en minúsculas | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | PostgreSQL uuid, API JSON, la mayoría de las librerías; la forma de salida canónica |
| MAYÚSCULAS | 6BA7B810-9DAD-11D1-80B4-00C04FD430C8 | Herramientas de Windows, salida de SQL Server |
| {Llaves} | {6ba7b810-9dad-11d1-80b4-00c04fd430c8} | .NET Guid.ToString("B"), registro de Windows y COM |
| 32 hex, sin guiones | 6ba7b8109dad11d180b400c04fd430c8 | Nombres de archivo, campos de log compactos |
| URN | urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8 | XML y estándares que piden una URI |
| 0x hex | 0x6BA7B8109DAD11D180B400C04FD430C8 | Literal para una columna BINARY(16) de MySQL |
| Base64 | a6e4EJ2tEdGAtADAT9QwyA== | Almacenamiento compacto o tokens en campos que solo admiten texto |
La opción de separador (guion, ninguno, punto o guion bajo) solo se aplica a las formas estándar, en mayúsculas y con llaves; un URN con puntos dejaría de ser un URN válido, así que la herramienta bloquea el separador en ese caso. Con la entrada es al revés: RFC 9562 pide salida en minúsculas pero entrada sin distinguir mayúsculas, y el decodificador acepta todas las formas anteriores excepto Base64. Si necesitas el orden de bytes de .NET o las costumbres de SQL Server, lee UUID vs GUID.
Listas en lote para fixtures y archivos de seed
La pestaña En lote crea de 1 a 10.000 ID de una vez y los exporta como texto plano, CSV con cabecera uuid, un array JSON o una sentencia INSERT INTO items (id) VALUES … lista para usar (cambia la tabla y la columna por las tuyas). Hay dos detalles que importan más que la cantidad:
- Las listas v7 van en orden estrictamente ascendente. Diez mil ID se crean en pocos milisegundos, así que la mayoría comparten marca de tiempo. Sin contador saldrían en orden aleatorio dentro de cada milisegundo; con él, la lista se ordena igual como texto y como bytes, y la línea de información confirma «en orden estrictamente ascendente».
- v5 y v3 reciben nombres, uno por línea. Pega una columna de dominios, URL o códigos de producto y obtendrás un ID determinista por línea, idéntico al que devuelve
uuid5()de Python para el mismo espacio de nombres y nombre.
¿Pueden coincidir dos UUID alguna vez?
Para los v4 aleatorios, la respuesta honesta es «sí, con una probabilidad que puedes calcular y después dejar de preocuparte». Con 122 bits aleatorios, la aproximación del cumpleaños da:
Ejemplo resuelto: creas mil millones de ID v4, n = 109. Entonces n² = 1018, 2 × 2122 ≈ 1,063 × 1037, el exponente es de unos 9,4 × 10−20 y p ≈ 9,4 × 10−20. Con un billón de ID ronda los 9,4 × 10−14. Necesitas aproximadamente 2,7 × 1018 ID para que la probabilidad de un solo duplicado llegue a la mitad.
El riesgo real nunca está en las matemáticas, sino en una fuente aleatoria débil: un fragmento copiado basado en Math.random(), un proceso bifurcado que reutiliza su semilla o una imagen de VM clonada con el mismo estado. Este generador de UUID toma cada bit aleatorio de crypto.getRandomValues(), el generador criptográfico del navegador. En v7, dos generadores independientes solo chocan si eligen el mismo milisegundo y además coinciden en unos 73 bits aleatorios (el contador se inicializa con 41 bits aleatorios y otros 32 bits siguen siendo aleatorios). Aun así, pon una restricción de unicidad en la columna: no cuesta nada y convierte un problema teórico en un error ruidoso.
Validar y decodificar: lo que te dice un ID
Pega un UUID en la pestaña Validar & decodificar y obtendrás su forma canónica, la versión, la variante, la hora incrustada en v1, v6 y v7 (en UTC y en tu hora local), la secuencia de reloj y el nodo de v1/v6, además de las formas hex para BINARY(16) y Base64. La comprobación del nodo te dice si un ID v1 lleva un nodo aleatorio (bit multicast activado, como recomienda RFC 9562) o algo que parece la dirección de una tarjeta de red real, una fuga de privacidad que conviene conocer.
Si en cambio pegas una columna entera, se convierte en una revisión de lista: cuántas líneas son válidas, cuáles no y por qué («hay 31 dígitos hexadecimales», «los guiones deben separar los dígitos en 8-4-4-4-12»), cuántas están duplicadas, si la lista está en orden ascendente y qué versiones contiene. Es la forma más rápida que conozco de auditar un archivo de importación antes de que choque con un índice único.
Además es estricto donde los validadores antiguos eran descuidados. Un UUID cuyo dígito de versión es 0 no es el UUID Nil salvo que los 32 dígitos sean cero; un ID con la variante heredada de Microsoft (17.º dígito c o d) está bien formado, pero su dígito de versión no significa nada, y el resultado lo dice en lugar de inventarse una versión.
Guardar UUID sin arrepentirte
- Usa el tipo nativo.
uuidde PostgreSQL yuniqueidentifierde SQL Server ocupan 16 bytes. Una columna de texto de 36 caracteres ocupa más del doble en la tabla y en cada índice que la incluya. En MySQL, usaBINARY(16); el formato 0x te da el literal. - Elige v7 para claves agrupadas o con muchas inserciones. Los nuevos valores v7 caen al final del índice en lugar de en páginas aleatorias.
- Mantén una sola forma canónica en tu API. Minúsculas con guiones. Compara sin distinguir mayúsculas si aceptas entradas de otros sistemas.
- Nunca trates un UUID como un secreto. RFC 9562 dice que no hay que dar por hecho que los UUID son difíciles de adivinar. Los enlaces de restablecimiento de contraseña y las claves de API necesitan un token aleatorio dedicado.
- No publiques v1 con una dirección MAC real. Identifica la máquina y el momento. Esta herramienta usa siempre un nodo aleatorio.
Para las líneas que crean UUID en PostgreSQL, JavaScript, Python, Java y C#, consulta cómo generar un UUID en código.
De dónde salen los bits y cómo los pruebo
Todo ocurre en tu navegador; la página no envía nada a ningún sitio. Los bits aleatorios vienen de crypto.getRandomValues(). La versión 7 sigue el método 1 de RFC 9562 §6.2 con un contador de 42 bits (el mismo esquema que uuid7() de Python): una semilla aleatoria nueva en cada milisegundo nuevo, más uno por cada ID adicional dentro de ese milisegundo, y si el reloj retrocede se reutiliza la última marca de tiempo para que el orden nunca se rompa. Las versiones 1 y 6 cuentan pasos de 100 nanosegundos desde el inicio del calendario gregoriano, suman un paso por ID dentro del mismo milisegundo y usan un nodo aleatorio con el bit multicast activado. Las versiones 5 y 3 calculan el hash de los 16 bytes del espacio de nombres seguidos del nombre en UTF-8 con SHA-1 o MD5 y luego fijan los bits de versión y variante, exactamente como hacen el texto de la RFC 9562 y el módulo uuid de Python.
El script anterior de este sitio tenía un bug real que vale la pena confesar: su aritmética del timestamp de v1 desbordaba un entero de 32 bits con signo, así que durante aproximadamente la mitad de cada siete minutos generaba ID que empezaban por un signo menos. Además, su salida v7 quedaba desordenada dentro de un milisegundo. Ambos están corregidos, y estos son algunos de los casos de control con los que se prueba la herramienta en cada cambio:
| Entrada | Resultado esperado |
|---|---|
v5, espacio de nombres DNS, nombre python.org | 886313e1-3b8a-5372-9b90-0c9aee199e5d |
v3, espacio de nombres DNS, nombre python.org | 6fa459ea-ee8a-3ca4-894e-db77e160355e |
v5, espacio de nombres URL, https://uuid-generator.net/ | dc63ab62-ce65-5436-9a00-37417044f8cf |
| v1 en el tiempo Unix 1791450549290 ms | empieza por ebbc68a0-c2f7-11f1 (el script antiguo imprimía -14439760-…) |
Decodificar 017f22e2-79b0-7cc3-98c4-dc0c0c07398f | v7, 2022-02-22 19:22:22.000 UTC |
Decodificar c232ab00-9414-11ec-b3c8-9f6bdeced846 | v1, mismo instante, secuencia de reloj 13256, nodo aleatorio |
| 10.000 ID v7 dentro de un mismo milisegundo | todos únicos, en orden estrictamente ascendente |
| UUID del espacio de nombres DNS en Base64 | a6e4EJ2tEdGAtADAT9QwyA== |
El decodificador lee la hora que un UUID dice llevar. Nada impide que alguien escriba cualquier marca de tiempo en un v7, así que trata la hora decodificada como información, no como prueba.
Guías
Preguntas frecuentes
¿Un UUID generado aquí es realmente único?
Cada ID v4 lleva 122 bits aleatorios del generador criptográfico de tu navegador; incluso con mil millones de ellos, la probabilidad de colisión ronda 9,4 × 10^-20. No se guarda ni se envía nada, así que nadie más ve tus ID.
¿Debería usar UUID v7 como clave primaria?
En tablas con muchas inserciones, sí: v7 empieza con una marca de tiempo en milisegundos, así que las claves nuevas quedan juntas en el índice. Quédate con v4 cuando el momento de creación no deba ser visible para quien vea el ID.
¿Un GUID es lo mismo que un UUID?
Sí, GUID es el nombre que usa Microsoft para el mismo identificador de 128 bits. Las diferencias son de costumbre: mayúsculas, llaves y un orden de bytes little-endian en los tres primeros grupos en .NET y SQL Server.
¿Cómo saco la marca de tiempo de un UUID?
Pégalo en la pestaña Validar & decodificar. Las versiones 1, 6 y 7 llevan una marca de tiempo y la herramienta la muestra en UTC y en tu hora local; v4 y v5 no contienen ninguna hora.
¿Por qué el mismo nombre da siempre el mismo UUID v5?
Un UUID v5 es un hash SHA-1 del espacio de nombres y el nombre, así que es determinista por diseño. Cambia un carácter, el espacio de nombres o una barra final en una URL y obtendrás un ID distinto.
¿Los UUID distinguen entre mayúsculas y minúsculas?
No. RFC 9562 pide a los generadores que produzcan minúsculas y a los parsers que acepten ambas. Guarda una sola forma y compara sin distinguir mayúsculas cuando los ID vengan de otros sistemas.
Actualizado