¿Qué es un UUID?
Un UUID (Universally Unique Identifier) es un identificador de 128 bits diseñado para ser único en el espacio y el tiempo, sin necesidad de una autoridad central. El resultado es una cadena de 36 caracteres con el formato:
550e8400-e29b-41d4-a716-446655440000
Codifica 32 dígitos hexadecimales en cinco grupos separados por guiones: 8-4-4-4-12.
Versiones de UUID
UUID v1 — Basado en tiempo + MAC
Combina la marca de tiempo actual con la dirección MAC de la interfaz de red. Está ordenado cronológicamente pero revela la dirección MAC y la marca de tiempo exacta — un problema de privacidad.
UUID v4 — Aleatorio (el más usado)
Rellena 122 bits con datos aleatorios criptográficamente seguros. No requiere estado ni coordinación. La opción predeterminada para la mayoría de los casos.
UUID v5 — Namespace + SHA-1
Determinista: el mismo namespace + nombre = mismo UUID siempre. Prefiere v5 sobre v3 (MD5 está obsoleto).
UUID v7 — Ordenado por tiempo (nuevo estándar)
Usa una marca de tiempo Unix en milisegundos en los bits más significativos. Los UUIDs son ordenables y mejoran dramáticamente el rendimiento de índices B-tree en bases de datos.
¿Por qué usar UUIDs?
- Sin coordinación central: Cualquier cliente o microservicio puede generar un UUID de forma independiente.
- Seguridad por opacidad: Los IDs enteros secuenciales exponen el volumen de datos. Los UUID no revelan nada.
- Fusión de bases de datos: Las tablas con claves UUID se fusionan sin conflictos.
- Generación offline: Las apps móviles pueden crear registros offline y sincronizar más tarde.
- Estándar de la industria: Soporte nativo en todas las bases de datos y frameworks principales.
UUID vs Otros Tipos de ID
| Tipo | Tamaño | Ordenable | Notas |
|---|---|---|---|
| Auto-increment int | 4–8 bytes | Sí | Expone el recuento; problemático en DBs distribuidas |
| UUID v4 | 16 bytes / 36 chars | No | Soporte universal; orden aleatorio daña índices |
| UUID v7 | 16 bytes / 36 chars | Sí (ms) | Lo mejor para claves primarias en DB |
| ULID | 26 chars | Sí (ms) | Más corto, URL-safe; no es estándar oficial |
| NanoID | ~21 chars | No | Corto y URL-safe; alfabet configurable |
Cuándo NO usar UUIDs
- Sobrecarga de almacenamiento: Una cadena UUID ocupa 36 bytes. Usa
BINARY(16)en MySQL o el tipo nativouuiden PostgreSQL. - Slugs de URL: Son demasiado largos y no memorables. Usa slugs legibles para URLs de cara al usuario.
- Fragmentación de índices con v4: Para tablas con muchas escrituras indexadas por clave primaria, usa UUID v7 o ULID.
VARCHAR(36) en tablas de alto volumen. Usa BINARY(16) con UUID_TO_BIN(uuid, 1).
Generar UUIDs en Código
JavaScript
const id = crypto.randomUUID(); // v4
Python
import uuid
id = str(uuid.uuid4())
PHP
use Ramsey\Uuid\Uuid;
$v4 = Uuid::uuid4()->toString();
$v7 = Uuid::uuid7()->toString();
SQL
-- MySQL: SELECT UUID();
-- PostgreSQL: SELECT gen_random_uuid();
Mejores Prácticas
- Almacena como binary:
BINARY(16)o tipo nativouuiden PostgreSQL. - Usa v4 para la mayoría de los casos.
- Usa v7 para claves primarias de base de datos.
- Evita v1 en contextos sensibles a la privacidad.
- Valida el formato UUID en la entrada.
- Usa siempre minúsculas.
Preguntas Frecuentes
¿Pueden dos UUIDs ser iguales?
Teóricamente sí. La probabilidad de colisión de v4 es aproximadamente 1 en 5.3×1036. En la práctica nunca ocurrirá en ningún sistema real.
¿v4 o v7 para claves primarias?
v7 para claves primarias de base de datos. v4 inserta en posiciones aleatorias en el índice B-tree, degradando el rendimiento. v7 garantiza inserciones al final del índice.
¿Son los UUID sensibles a mayúsculas?
No. Son insensibles a mayúsculas. Por convención, usa siempre minúsculas.