Saltar al contenido principal

Generador de UUID Versión 7

UUIDv7 • Ordenado por Tiempo (RFC 9562)
00000000-0000-0000-0000-000000000000
Encapsular:

Generar UUIDs Masivos

Máx 5.000
Formato y Estructura

Listo

No batch active
Estándar Moderno (2024)RFC 9562 Sección 5.7

Especificación Técnica UUID Versión 7 (RFC 9562)

UUIDv7 combina una marca de tiempo Unix de 48 bits (en milisegundos) con 74 bits de entropía criptográfica aleatoria y secuencia. Fue estandarizado en RFC 9562 (2024) para resolver la degradación de índices y la fragmentación de páginas en bases de datos causadas por UUIDv4.

Distribución de Bits y Estructura Binaria

Distribución detallada de 128 bits según las normas RFC.

CampoRango de BitsPropósito y Descripción
unix_ts_ms48 bits (0-47)Marca de tiempo Epoch de Unix en milisegundos (big-endian).
ver4 bits (48-51)Valor binario constante 0111 (identifica la Versión 7).
rand_a12 bits (52-63)Entropía aleatoria o contador de secuencia sub-milisegundo.
var2 bits (64-65)Valor binario constante 10 (variante estándar RFC 4122/9562).
rand_b62 bits (66-127)Bits de entropía pseudoaleatoria criptográficamente segura.

Ventajas y Fortalezas

  • Orden cronológico natural; ideal para índices B-Tree agrupados (PostgreSQL, MySQL, SQLite).
  • Elimina E/S aleatoria en disco, desalojo de caché y división de páginas B-Tree en inserciones masivas.
  • 74 bits de entropía por milisegundo previenen colisiones en microservicios distribuidos.
  • La marca de tiempo se puede decodificar directamente sin consultar la base de datos.
!

Consideraciones y Desventajas

  • Revela la hora aproximada de creación (resolución de milisegundos) en URLs públicas.
  • Requiere un contador monotónico al generar múltiples IDs en el mismo milisegundo.

Recomendado para

  • Claves primarias en bases de datos relacionales y documentales (PostgreSQL, MySQL, CockroachDB, MongoDB).
  • Transmisión de eventos, registros de auditoría y colas de mensajes (Kafka, RabbitMQ, SQS).
  • Series temporales y registros cronológicos.

Cuándo evitar

  • Tokens de seguridad o cookies de sesión secretas donde la marca temporal deba ser confidencial.
  • Sistemas que requieren enteros secuenciales sin sobrecarga temporal.

Ejemplos de Implementación en Código

Native Node.js / BrowserTypeScript / Node.js
// Browser / Node 22+ with Web Crypto
function generateUUIDv7(): string {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  const now = Date.now();

  bytes[0] = (now / 0x10000000000) & 0xff;
  bytes[1] = (now / 0x100000000) & 0xff;
  bytes[2] = (now / 0x1000000) & 0xff;
  bytes[3] = (now / 0x10000) & 0xff;
  bytes[4] = (now / 0x100) & 0xff;
  bytes[5] = now & 0xff;

  bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant

  return [...bytes].map((b, i) =>
    (i === 4 || i === 6 || i === 8 || i === 10 ? '-' : '') + b.toString(16).padStart(2, '0')
  ).join('');
}
Python (uuid6 / 3.14+)Python
import uuid6

new_id = uuid6.uuid7()
print(new_id) # e.g. 018e6a12-8921-71e4-8a4e-128a9b345678
PostgreSQL FunctionPostgreSQL
-- PostgreSQL 13+ native UUIDv7 generator
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid AS $$
DECLARE
  v_time numeric = extract(epoch FROM clock_timestamp()) * 1000;
  v_bytes bytea = gen_random_bytes(16);
BEGIN
  v_bytes = set_byte(v_bytes, 0, (v_time::bigint >> 40)::int);
  v_bytes = set_byte(v_bytes, 1, (v_time::bigint >> 32)::int);
  v_bytes = set_byte(v_bytes, 2, (v_time::bigint >> 24)::int);
  v_bytes = set_byte(v_bytes, 3, (v_time::bigint >> 16)::int);
  v_bytes = set_byte(v_bytes, 4, (v_time::bigint >> 8)::int);
  v_bytes = set_byte(v_bytes, 5, (v_time::bigint)::int);
  v_bytes = set_byte(v_bytes, 6, (get_byte(v_bytes, 6) & 15) | 112);
  v_bytes = set_byte(v_bytes, 8, (get_byte(v_bytes, 8) & 63) | 128);
  RETURN encode(v_bytes, 'hex')::uuid;
END;
$$ LANGUAGE plpgsql VOLATILE;

Preguntas Frecuentes

¿Por qué cambiar de UUIDv4 a UUIDv7?
UUIDv4 inserta datos aleatoriamente en el índice B-Tree, causando fragmentación severa. UUIDv7 se añade secuencialmente en orden cronológico, logrando hasta 4 veces más velocidad de inserción.
¿Es UUIDv7 compatible con columnas existentes de UUIDv4?
Sí. Ambos formatos usan el mismo estándar de 128 bits (32 dígitos hexadecimales con 4 guiones) y son 100% compatibles sin migración de esquemas.
¿Pueden colisionar dos UUIDv7 generados en el mismo milisegundo?
No. Incluyen 74 bits de entropía y secuenciación que permiten generar miles de millones de identificadores por milisegundo sin riesgo.