Generador UUID
¿Qué es un UUID?
UUID (Universally Unique Identifier, Identificador único universal) es un número de 128 bits utilizado para identificar de manera única información en sistemas informáticos. UUID también se conoce como GUID (Globally Unique Identifier, Identificador único global).
Características de UUID
- Unicidad: La probabilidad de generar UUIDs duplicados en un sistema distribuido es extremadamente baja
- Estandarización: Conforme al estándar RFC 4122
- Multiplataforma: Puede ser utilizado en diferentes sistemas operativos y lenguajes de programación
- Descentralizado: No requiere autoridad de coordinación central
Escenarios de aplicación de UUID
- Clave primaria de base de datos: Utilizado como clave primaria en bases de datos distribuidas
- Identificación de archivos: Identificar archivos en el sistema de archivos
- Gestión de sesiones: Identificador de sesión en aplicaciones web
- Cola de mensajes: Identificación única de mensajes
- Interfaz API: Identificación de solicitudes y respuestas API
Detalles de versiones UUID
UUID v1 (basado en tiempo y nodo)
Formato: xxxxxxxx-xxxx-1xxx-yxxx-xxxxxxxxxxxx
Características:
- Basado en la hora actual y el ID del nodo (normalmente la dirección MAC)
- Contiene información de marca de tiempo, puede ser ordenado por tiempo
- Puede revelar información de dirección MAC
Algoritmo de generación:
// Ejemplo de pseudocódigo
function generateUUIDv1() {
const timestamp = Date.now();
const nodeId = getMACAddress();
const clockSeq = random16Bit();
return formatUUID(timestamp, clockSeq, nodeId);
}
UUID v3 (basado en namespace y MD5)
Formato: xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx
Características:
- Basado en el hash MD5 del UUID del namespace y el nombre
- El mismo namespace y el mismo nombre siempre producen el mismo UUID
- Aplicable a escenarios que requieren UUIDs deterministas
Algoritmo de generación:
function generateUUIDv3(namespace, name) {
const namespaceBytes = parseUUID(namespace);
const nameBytes = Buffer.from(name, 'utf8');
const hash = crypto
.createHash('md5')
.update(Buffer.concat([namespaceBytes, nameBytes]))
.digest();
return formatUUIDv3(hash);
}
UUID v4 (generación aleatoria)
Formato: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
Características:
- Generación completamente aleatoria
- Versión UUID más comúnmente utilizada
- No contiene información significativa
Algoritmo de generación:
function generateUUIDv4() {
const bytes = crypto.randomBytes(16);
bytes[6] = (bytes[6] & 0x0f) | 0x40; // Versión 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // Variante
return formatUUID(bytes);
}
UUID v5 (basado en namespace y SHA-1)
Formato: xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx
Características:
- Basado en el hash SHA-1 del UUID del namespace y el nombre
- Más seguro que v3 (usa SHA-1 en lugar de MD5)
- Aplicable a escenarios que requieren UUIDs deterministas
UUID NIL (UUID vacío)
Formato: 00000000-0000-0000-0000-000000000000
Características:
- Todos los bits son 0
- Utilizado para representar "sin UUID" o "UUID desconocido"
- Utilizado como valor por defecto en el diseño de base de datos
Namespaces predefinidos
UUIDs de namespace estándar
- Namespace DNS:
6ba7b810-9dad-11d1-80b4-00c04fd430c8
- Namespace URL:
6ba7b811-9dad-11d1-80b4-00c04fd430c8
- Namespace OID:
6ba7b812-9dad-11d1-80b4-00c04fd430c8
- Namespace X.500 DN:
6ba7b814-9dad-11d1-80b4-00c04fd430c8
Ejemplo de uso
// Generar UUID v3 usando namespace DNS
const dnsNamespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
const uuid = generateUUIDv3(dnsNamespace, 'example.com');
// Resultado: 5df41881-3aed-3515-88a7-2f4a814cf09e
Interfaz API
Generación de UUID único
// Generar UUID v4
const uuid = generateUUID('v4');
// Generar UUID v1
const uuid = generateUUID('v1');
// Generar UUID v3
const uuid = generateUUID('v3', {
namespace: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
name: 'example.com',
});
Generación de UUID por lotes
// Generación de UUID por lotes
const uuids = generateMultipleUUIDs('v4', 10);
// Generar UUIDs de diferentes versiones
const mixedUUIDs = generateMultipleUUIDs(['v1', 'v4', 'v5'], 5);
Validación UUID
// Validar formato UUID
const isValid = validateUUID('550e8400-e29b-41d4-a716-446655440000');
// Obtener versión UUID
const version = getUUIDVersion('550e8400-e29b-41d4-a716-446655440000');
Consideraciones de rendimiento
Velocidad de generación
- v4 (aleatorio): Más rápido, aproximadamente 100,000 UUID/segundo
- v1 (tiempo): Medio, aproximadamente 50,000 UUID/segundo
- v3/v5 (hash): Más lento, aproximadamente 10,000 UUID/segundo
Uso de memoria
- Cada UUID ocupa 16 bytes
- Atención al uso de memoria durante la generación por lotes
Seguridad de concurrencia
- v4 utiliza un generador de números aleatorios criptográficamente seguro
- v1 requiere asegurar la unicidad de la secuencia de reloj
Mejores prácticas
Selección de versión UUID
- Uso general: Usar UUID v4
- Ordenamiento temporal necesario: Usar UUID v1
- Determinismo necesario: Usar UUID v3 o v5
- Clave primaria de base de datos: Recomendar UUID v4
Optimización de almacenamiento
-- Almacenamiento UUID en PostgreSQL
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255)
);
-- Crear índice
CREATE INDEX idx_users_id ON users(id);
Optimización de rendimiento
// Usar pool de objetos para reducir asignación de memoria
const uuidPool = new Array(1000).fill(null).map(() => generateUUIDv4());
// Usar Web Workers para generación por lotes
const worker = new Worker('uuid-worker.js');
worker.postMessage({ type: 'generate', count: 1000 });
Preguntas frecuentes
P: ¿Cuál es la diferencia entre UUID y GUID?
R: UUID y GUID son esencialmente los mismos, solo difieren los nombres. UUID es el término estándar RFC, GUID es el término de Microsoft.
P: ¿Pueden duplicarse los UUIDs?
R: Teóricamente posible, pero la probabilidad es extremadamente baja. La probabilidad de duplicación de un UUID v4 es aproximadamente 2.71 × 10^-36.
P: ¿Cómo elijo la versión UUID?
R: Elegir según los requisitos:
- Necesidad de aleatoriedad: v4
- Necesidad de información temporal: v1
- Necesidad de determinismo: v3 o v5
P: ¿El UUID afecta el rendimiento de la base de datos?
R: Puede afectar porque el UUID es más grande que una clave primaria entera. Recomendaciones:
- Usar índices B-tree
- Considerar el uso de UUID v1 (ordenamiento temporal)
- Usar claves primarias enteras en casos apropiados
Herramientas relacionadas
Especificaciones técnicas
Estándares RFC
- RFC 4122: Especificación UUID
- RFC 4122 Section 4.1.3: Definiciones de versiones UUID
Soporte de lenguajes de programación
- JavaScript:
crypto.randomUUID()
(Node.js 14.17+) - Python: Módulo
uuid
- Java:
java.util.UUID
- C#:
System.Guid
Última actualización: 20 de enero de 2024