La primera vez que los UUID realmente me importaron, estaba moviendo un SaaS adyacente a WordPress de una sola caja MySQL a una configuración con una réplica leída y un plan para fragmentarlo más tarde. Los ID de incremento automático habían estado bien durante años, hasta que dos servicios comenzaron a insertarse en lo que se convertiría en la misma tabla lógica, y de repente id = 42 significaba dos filas diferentes. Ese es el momento en que el incremento automático deja de funcionar silenciosamente, y los UUID son la respuesta habitual.
Un UUID es un valor de 128 bits que puede generar en cualquier máquina, en cualquier momento, sin coordinación, y aún así confiar en que sea único. Esa parte de "no hay coordinación" es todo el punto: una aplicación móvil sin conexión en un avión, tres microservicios y un trabajador de fondo pueden mentar todos los ID de forma simultánea y nunca colisionar. Las matemáticas respaldan esa confianza es genuinamente absurda, y te mostraré cuán absurdo en un segundo.
los generador de UUID en Toolz.dev crea UUID únicos o masivos en varias versiones al instante, directamente en su navegador, lo cual es útil cuando usted & 39; está sembrando una tabla o necesita una identificación desechable para una prueba. Esta guía cubre lo que realmente significan las versiones, cuál elegir en 2026, cómo almacenarlas sin destruir el índice de su base de datos y los errores que cometí para que pueda omitirlas.
TL;Dr: Para las claves primarias de base de datos nuevas en 2026, genere UUID V7- it's ordenado en el tiempo para que se indexe bien y no lo hace't filtra hardware como v1. Usar V4 Cuando quieres pura imprevisibilidad. Guárdelos como nativos
uuidTipo oBINARY(16), nuncaVARCHAR(36). hacerlos a granel con el generador de UUIDy emparejarlo con el Convertidor de marca de tiempo Para leer el tiempo horneado en un V7. Todo el lado del cliente, todo gratis.
¿Qué es un UUID, exactamente?
Un UUID (Identificador Único Universal) es un número de 128 bits que se utiliza para identificar algo sin que una autoridad central reparta ID. Microsoft llama a lo mismo GUID (Identificador Único Global); ellos' son idénticos en todos los sentidos que importan. La forma del texto canónico es de 36 caracteres: 32 dígitos hexadecimales divididos en cinco grupos con guiones de 8-4-4-4-12:
550e8400-e29b-41d4-a716-446655440000
Dos de esas posiciones hexadecimales son 't datos aleatorios - ellos 're metadatos. El decimotercer dígito hexadecimal codifica el versión (Qué estrategia de generación lo hizo), y el primer dígito del cuarto grupo codifica el variante (qué estándar de diseño sigue - 8, 9, a, o b para los UUID estándar). Así que en el ejemplo anterior, el 4 En el tercer grupo te dice que es un V4.
¿Qué tan único es "único", realmente?
Después de reservar los bits de versión y variante, un UUID V4 tiene 122 bits aleatorios. Esos 2^122 valores posibles, o alrededor de 5.3 Undecillion:
5,316,911,983,139,663,491,615,228,241,121,400,000
Para concretar eso: si generas mil millones de UUID cada segundo, necesitas aproximadamente 86 años antes de alcanzar incluso un 50% de probabilidad de que seas golpe que marca un colisión en cualquier lugar. En términos prácticos de ingeniería, las colisiones V4 no ocurren, y puedes diseñar como si nunca lo hicieran.
¿Cuál es la diferencia entre UUID V1, V4 y V7?
La especificación - originalmente RFC 4122, ahora actualizado por RFC 9562 (2024)- define varias versiones. Tres cuestiones para el trabajo diario.
UUID v1 - marca de tiempo + dirección MAC
v1 une una marca de tiempo de 100 nanosegundos (contando desde el 15 de octubre de 1582, la fecha en que comenzó el calendario gregoriano, una de mis trivia de especificaciones favoritas) con la tarjeta de red y la dirección MAC #39; It's naturalmente ordenado en el tiempo y puedes extraer el tiempo de creación de él.
El problema está ahí en la definición: incrusta la dirección MAC de la máquina que la hizo. Eso filtra la identidad del hardware y, combinado con la marca de tiempo, hace que los ID sean algo predecibles. Ejemplo: 6ba7b810-9dad-11d1-80b4-00c04fd430c8. Ahora solo uso v1 para la compatibilidad heredada.
UUID v4 - aleatorio
V4 es 122 bits de aleatoriedad y nada más. Es la versión que la mayoría de la gente quiere decir cuando dice "uuid" y es muy simple: sin marca de tiempo, sin hardware, sin pedido. Ejemplo: f47ac10b-58cc-4372-a567-0e02b2c3d479.
La ventaja es que no filtra nada y es impredecible, que es exactamente lo que quieres para cualquier cosa que no debería ser adivinable. La desventaja es que es que franco, por lo que las inserciones consecutivas se dispersan por todo el índice, lo que, como descubrí, tiene un costo de rendimiento real a escala.
UUID v7 - ordenado por tiempo + aleatorio
V7 es el compromiso moderno, estandarizado en RFC 9562. Los primeros 48 bits son una marca de tiempo Unix en milisegundos; el resto es aleatorio. Ejemplo: 018e4880-d4d0-7b9c-8c37-2a5c0f1e3d8a.
Ese diseño significa que los ID v7 se clasifican cronológicamente: las nuevas filas aterrizan en "end" de un índice de árbol B en lugar de dispersarse, sin dejar de ser globalmente único y libre de coordinación. Se filtra el tiempo de creación aproximado (generalmente bien), pero no el hardware. Para proyectos nuevos, esta es mi clave principal predeterminada, y es la dirección que ahora apunta también el IETF.
Aquí está la compensación de un vistazo:
| versión | ordenado? | filtraciones | mejor para |
|---|---|---|---|
| V1 | Sí (tiempo) | Dirección MAC + Hora | Solo sistemas heredados |
| V4 | No (aleatorio) | cero | Tokens no adivinables, IDs generales |
| V7 | Sí (tiempo) | Tiempo aproximado de creación | Nuevas claves primarias de base de datos nuevas |
Las versiones menos utilizadas también existen: V3 y V5 son hashes deterministas de un espacio de nombres más un nombre (V5 usa SHA-1 y se prefiere a MD5 de V3), V6 es un V1 reordenado y V8 está reservado para implementaciones personalizadas.
¿Debería usar UUID o ID de incremento automático?
Este es el debate que he tenido en más revisiones de diseño que cualquier otra, así que aquí está el marco que realmente uso en lugar de una respuesta religiosa.
Quédese con el incremento automático cuando tiene una única base de datos, el rendimiento y el almacenamiento son ajustados y los humanos necesitan leer los ID. Un número entero tiene 4-8 bytes frente a un UUID's 16, las comparaciones de números enteros son más rápidas y "orden #12345" es mucho más fácil de leer en el teléfono que un UUID de 36 caracteres. En una sola caja sin fragmentación, el incremento automático es realmente la opción más simple y rápida: don' No alcanzar UUID pasado de moda.
Cambiar a UUID cuando cualquiera de estos es cierto: usted & #39;re distribuido (múltiples servicios o servidores acuñando ID de forma independiente), usted & # 39;Estoy preocupado por la enumeración (las ID de incremento automático son adivinables y revelan silenciosamente los recuentos de sus registros) /users/1234 Le dice a un atacante que tiene menos de 1.235 usuarios), necesita fusionar datos de varias bases de datos sin colisiones, o que desea que los clientes generen ID antes de sincronizar. Ese punto de enumeración es una consideración de seguridad real que la gente subestima.
Y el término medio V7: UUID V7 le brinda la generación distribuida de un UUID y El ordenamiento amigable con el índice de auto-incremento, sin filtrar cuentas de registros. Para la mayoría de los proyectos nuevos en 2026 que necesitan ID no secuenciales, V7 es la respuesta que finaliza el debate.
¿Cómo almacena UUID sin destrozar su índice?
Esta es la sección nacida de mi propio error costoso, así que presta atención aquí si en ningún otro lugar.
En esa migración que mencioné, guardé los nuevos UUID como VARCHAR(36) porque era lo obvio y legible. Funcionó y luego la tabla creció y las inserciones y uniones se volvieron considerablemente más lentas. Se agravaron dos problemas: gasté 36 bytes por ID en lugar de 16 y Estaba usando UUID V4 aleatorios, por lo que cada inserción aterrizaba en un punto aleatorio en el índice de clave principal, fragmentándolo y golpeando el grupo de búfer. La solución los almacenaba como binarias y, en el siguiente proyecto, cambiando a V7 para que los insertos permanecieran secuenciales.
PostgreSQL tiene un nativo uuid escriba - úselo. Almacena 16 bytes y se compara rápidamente:
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
mic No tiene un tipo de UUID nativo, así que almacena BINARY(16) y convertir con UUID_TO_BIN() / BIN_TO_UUID(). El segundo argumento importa:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- The `true` swaps the timestamp bytes for better index locality on v1
INSERT INTO users (id, name, email)
VALUES (UUID_TO_BIN(UUID(), true), 'Alice', '[email protected]');
SELECT BIN_TO_UUID(id, true) AS id, name, email FROM users;
La regla a recordar: nativo uuid Escriba donde tenga uno, BINARY(16) donde no, y VARCHAR(36) Básicamente, nunca por una clave, indexarás y te unirás.
¿Cómo se generan UUID en el código?
Para una rápida única, la generador de UUID es más rápido que abrir una repl. En código, cada idioma principal tiene esto integrado o a un paso.
JavaScript / Mecanografia- tanto el navegador como el Nodo envían ahora un generador v4:
const id = crypto.randomUUID(); // v4, no dependency needed
// For v7, use the 'uuid' package:
import { v7 as uuidv7 } from 'uuid';
const ordered = uuidv7();
pitón:
import uuid
uuid.uuid4() # random
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') # deterministic (SHA-1)
Java: UUID.randomUUID() Te da V4 fuera de la caja; V7 necesita una biblioteca como java-uuid-generator o una pequeña implementación de RFC 9562.
ir: github.com/google/uuid te da a ambos - uuid.New() para V4 y uuid.NewV7() para V7.
Tenga en cuenta que los ayudantes de tiempo de ejecución nativos casi siempre le dan v4. Si desea específicamente V7 para su pedido, generalmente necesita una biblioteca, ya que es el estándar más nuevo y no todos los stdlib se han puesto al día.
¿Dónde aparecen realmente los UUID en los sistemas reales?
Es fácil hablar de UUID en abstracto, así que aquí están los lugares concretos en los que he confiado, porque la versión que eliges realmente depende del trabajo.
Claves primarias de base de datos en una configuración distribuida. Este es el caso clásico y el que empezó este artículo para mí. En el momento en que más de un escritor puede insertar en la misma tabla lógica (réplicas, fragmentos o dos servicios que comparten un esquema), el incremento automático se rompe. Una clave principal v7 resuelve el problema de coordinación y aún se indexa limpiamente porque está ordenada en el tiempo.
ID generados por el cliente para las aplicaciones sin conexión. Una aplicación móvil o un SPA de navegador a menudo necesita crear un registro antes de poder comunicarse con el servidor; piense en una nota escrita en un plano o en una interfaz de usuario optimista que muestra la nueva fila al instante. Si el cliente crea un UUID al principio, el registro tiene una identidad estable desde la primera pulsación de tecla y se sincroniza más tarde sin un servidor de ida y vuelta a " obtenga una identificación." Yo y#39; He usado esto para hacer que los formularios parezcan instantáneos incluso en conexiones anticuadas.
Identificadores de recursos no enumerables en URL y API. puesta /orders/1042 En una URL, le dice a cualquiera que haya tenido como máximo 1042 pedidos y les permite caminar. /orders/1041, /orders/1040, etcétera. El intercambio en un UUID elimina tanto la fuga de la métrica empresarial como la fácil enumeración. Para cualquier cosa que un usuario pueda ver en una URL, vale la pena hacerlo, aunque recuerde que un UUID no es un mecanismo de control de acceso; Aún necesitas verificaciones de autorización reales detrás de esto.
ID de correlación para el seguimiento. Cuando una sola solicitud se activa en cinco microservicios, adjuntando un UUID como ID de correlación y registrándolo en cada salto, " en algún lugar de este lío algo falló " en una sola cadena greppable en todos sus registros. Este es un lugar donde incluso una simple v4 es perfecta; no es necesario realizar pedidos, solo singularidad.
Claves de idoneidad. Las API de pago y webhook a menudo le piden al cliente que envíe un UUID como clave de id de idoneidad para que una solicitud reintentada no cargue una tarjeta dos veces. El cliente lo genera una vez, lo reutiliza en reintentos y el servidor se deduce en él. Es un pequeño patrón que evita una clase de error muy costosa.
Preguntas frecuentes
¿Para qué se utiliza un UUID?
Un UUID identifica algo de forma única (una fila de base de datos, un recurso API, una sesión, un archivo cargado, un seguimiento de microservicios) sin necesidad de un servicio central para repartir ID. It's la opción a seguir siempre que varios sistemas o clientes deban crear identificadores de forma independiente y aún así asegurarse de que ganen't chocar. Puedes generar uno instantáneamente con el generador de UUID en Toolz.dev.
¿Pueden dos UUID ser idénticos?
En teoría sí; en la práctica no. Un UUID V4 tiene 122 bits aleatorios, lo que da alrededor de 5.3 posibilidades de decillion. Necesitas generar en el orden de 2.7 quintillón UUID antes de alcanzar un 50% de probabilidad de incluso una colisión. Para cada propósito de ingeniería real, puede tratar los UUID como únicos garantizados.
¿Qué versión de UUID debo usar en 2026?
Para nuevas claves primarias de bases de datos, UUID v7 - it's ordenado por tiempo para una indexación eficiente sin dejar de ser globalmente único, y it's la recomendación actual del IETF bajo RFC 9562. Utilice v4 cuando importe la imprevisibilidad, como identificadores que no deben ser adivinable. Evite v1 para nuevos trabajos porque incorpora la máquina generadora y la dirección MAC #39;s.
¿Los UUID son secuenciales?
v1 y v7 están ordenados en el tiempo, por lo que los ID se generan posteriormente ordenados después de los anteriores; v4 es completamente aleatorio sin orden. El orden secuencial es lo que hace que v7 sea compatible con los índices del árbol B: se agregan nuevas filas en lugar de dispersarse. Si usted & #39; Si utiliza v4 aleatorio como clave principal en una tabla grande, esa falta de orden puede perjudicar el rendimiento de inserción e índice.
¿Cómo debo almacenar UUID en una base de datos?
Usa el nativo uuid Escriba si su base de datos tiene uno (PostgreSQL sí). De lo contrario tienda BINARY(16), y en MySQL 8.0+ Convertir con UUID_TO_BIN() y BIN_TO_UUID(). esquivar VARCHAR(36) investigaciones operacionales CHAR(36) para claves, el almacenamiento de cadenas desperdicia 20 bytes por fila y ralentiza cada comparación, lo que se suma rápidamente en tablas grandes.
¿Cuál es la diferencia entre un UUID y un GUID?
Son lo mismo. UUID es el término de RFC 4122 que se usa en la mayoría de los idiomas y plataformas; GUID es el nombre de Microsoft para ello, común en Windows y .NET. El formato y las garantías son idénticos, por lo que puede tratar un GUID y un UUID de manera intercambiable.
¿Puedo extraer el tiempo de creación de un UUID?
Desde v1, v6 y v7, sí, codifican una marca de tiempo. v7 almacena una marca de tiempo Unix de milisegundos en sus primeros 48 bits, que puedes decodificar y leer con Convertidor de marca de tiempo. V4 y V5 no contienen información de tiempo, por lo que no hay nada que extraer de ellos.
¿Uuid v4 es lo suficientemente seguro para los tokens de sesión?
no por sí solo. Los 122 bits aleatorios de V4 son impredecibles, pero los tokens de sesión y autenticación generalmente quieren al menos 256 bits de un generador criptográfico seguro. Use un token aleatorio seguro diseñado para la autenticación y reserve los UUID para identificar recursos en lugar de protegerlos.
¿Cómo genero un UUID?
Usa el generador incorporado de tu idioma: crypto.randomUUID() En navegadores modernos y node.js, uuid.uuid4() en Python, o Guid.NewGuid() En .NET cada uno produce un UUID V4 en una sola llamada. Para una única vez o un lote, genere al instante con el generador de UUID en Toolz.dev, no se requiere código.
¿Cuántos caracteres es un UUID?
Un UUID tiene 36 caracteres en su forma de texto canónico: 32 dígitos hexadecimales más los cuatro guiones que lo dividen en grupos 8-4-4-4-12. Ese texto codifica 128 bits, por lo que almacenarlo como 16 bytes sin formato con BINARY(16) es mucho más compacto que la cadena de 36 caracteres.
envolviendo
Los UUID son una de esas bases en las que no piensas hasta que un sistema pasa de una única base de datos, y luego son & 39;lo son todo. La versión corta de 2026: predeterminada V7 Para las nuevas claves primarias, use V4 Cuando necesites ID no inestables, guárdalas como nativo uuid investigaciones operacionales BINARY(16)y omita V1 para cualquier cosa nueva. aprender de mi VARCHAR(36) tarde para que no lo repitas.
Generarlos al instante con el Free generador de UUID en Toolz.dev: versión única o masiva, cualquier versión, todo del lado del cliente sin nada cargado. Cuando necesites leer la hora dentro de un v7, busca el Convertidor de marca de tiempoy navegar por el resto de Herramientas de codificación- más de 600 utilidades gratuitas - más de a Toolz.dev.



