Gerador UUID
O que é um UUID?
UUID (Universally Unique Identifier, Identificador Único Universal) é um número de 128 bits usado para identificar de forma única informações em sistemas de computador. UUID também é conhecido como GUID (Globally Unique Identifier, Identificador Único Global).
Características do UUID
- Unicidade: A probabilidade de gerar UUIDs duplicados em um sistema distribuído é extremamente baixa
- Padronização: Conforme ao padrão RFC 4122
- Multiplataforma: Pode ser usado em diferentes sistemas operacionais e linguagens de programação
- Descentralizado: Não requer autoridade de coordenação central
Cenários de aplicação do UUID
- Chave primária de banco de dados: Usado como chave primária em bancos de dados distribuídos
- Identificação de arquivos: Identificar arquivos no sistema de arquivos
- Gerenciamento de sessão: Identificador de sessão em aplicações web
- Fila de mensagens: Identificação única de mensagens
- Interface API: Identificação de requisições e respostas API
Detalhes das versões UUID
UUID v1 (baseado em tempo e nó)
Formato: xxxxxxxx-xxxx-1xxx-yxxx-xxxxxxxxxxxx
Características:
- Baseado na hora atual e ID do nó (normalmente endereço MAC)
- Contém informações de timestamp, pode ser ordenado por tempo
- Pode revelar informações de endereço MAC
Algoritmo de geração:
// Exemplo de pseudocódigo
function generateUUIDv1() {
const timestamp = Date.now();
const nodeId = getMACAddress();
const clockSeq = random16Bit();
return formatUUID(timestamp, clockSeq, nodeId);
}
UUID v3 (baseado em namespace e MD5)
Formato: xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx
Características:
- Baseado no hash MD5 do UUID do namespace e nome
- O mesmo namespace e o mesmo nome sempre produzem o mesmo UUID
- Aplicável a cenários que requerem UUIDs determinísticos
Algoritmo de geração:
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 (geração aleatória)
Formato: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
Características:
- Geração completamente aleatória
- Versão UUID mais comumente utilizada
- Não contém informações significativas
Algoritmo de geração:
function generateUUIDv4() {
const bytes = crypto.randomBytes(16);
bytes[6] = (bytes[6] & 0x0f) | 0x40; // Versão 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // Variante
return formatUUID(bytes);
}
UUID v5 (baseado em namespace e SHA-1)
Formato: xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx
Características:
- Baseado no hash SHA-1 do UUID do namespace e nome
- Mais seguro que v3 (usa SHA-1 em vez de MD5)
- Aplicável a cenários que requerem UUIDs determinísticos
UUID NIL (UUID vazio)
Formato: 00000000-0000-0000-0000-000000000000
Características:
- Todos os bits são 0
- Usado para representar "sem UUID" ou "UUID desconhecido"
- Usado como valor padrão no design de banco de dados
Namespaces predefinidos
UUIDs de namespace padrão
- 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
Exemplo de uso
// Gerar UUID v3 usando namespace DNS
const dnsNamespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
const uuid = generateUUIDv3(dnsNamespace, 'example.com');
// Resultado: 5df41881-3aed-3515-88a7-2f4a814cf09e
Interface API
Geração de UUID único
// Gerar UUID v4
const uuid = generateUUID('v4');
// Gerar UUID v1
const uuid = generateUUID('v1');
// Gerar UUID v3
const uuid = generateUUID('v3', {
namespace: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
name: 'example.com',
});
Geração de UUID em lote
// Geração de UUID em lote
const uuids = generateMultipleUUIDs('v4', 10);
// Gerar UUIDs de diferentes versões
const mixedUUIDs = generateMultipleUUIDs(['v1', 'v4', 'v5'], 5);
Validação UUID
// Validar formato UUID
const isValid = validateUUID('550e8400-e29b-41d4-a716-446655440000');
// Obter versão UUID
const version = getUUIDVersion('550e8400-e29b-41d4-a716-446655440000');
Considerações de performance
Velocidade de geração
- v4 (aleatório): Mais rápido, aproximadamente 100.000 UUID/segundo
- v1 (tempo): Médio, aproximadamente 50.000 UUID/segundo
- v3/v5 (hash): Mais lento, aproximadamente 10.000 UUID/segundo
Uso de memória
- Cada UUID ocupa 16 bytes
- Atenção ao uso de memória durante a geração em lote
Segurança de concorrência
- v4 usa um gerador de números aleatórios criptograficamente seguro
- v1 requer assegurar a unicidade da sequência de relógio
Melhores práticas
Seleção de versão UUID
- Uso geral: Usar UUID v4
- Ordenação temporal necessária: Usar UUID v1
- Determinismo necessário: Usar UUID v3 ou v5
- Chave primária de banco de dados: Recomendar UUID v4
Otimização de armazenamento
-- Armazenamento UUID no PostgreSQL
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255)
);
-- Criar índice
CREATE INDEX idx_users_id ON users(id);
Otimização de performance
// Usar pool de objetos para reduzir alocação de memória
const uuidPool = new Array(1000).fill(null).map(() => generateUUIDv4());
// Usar Web Workers para geração em lote
const worker = new Worker('uuid-worker.js');
worker.postMessage({ type: 'generate', count: 1000 });
Perguntas frequentes
P: Qual é a diferença entre UUID e GUID?
R: UUID e GUID são essencialmente os mesmos, apenas os nomes diferem. UUID é o termo padrão RFC, GUID é o termo da Microsoft.
P: UUIDs podem ser duplicados?
R: Teoricamente possível, mas a probabilidade é extremamente baixa. A probabilidade de duplicação de um UUID v4 é aproximadamente 2,71 × 10^-36.
P: Como escolho a versão UUID?
R: Escolher de acordo com os requisitos:
- Necessidade de aleatoriedade: v4
- Necessidade de informações temporais: v1
- Necessidade de determinismo: v3 ou v5
P: UUID afeta a performance do banco de dados?
R: Pode afetar porque UUID é maior que uma chave primária inteira. Recomendações:
- Usar índices B-tree
- Considerar o uso de UUID v1 (ordenação temporal)
- Usar chaves primárias inteiras em casos apropriados
Ferramentas relacionadas
Especificações técnicas
Padrões RFC
- RFC 4122: Especificação UUID
- RFC 4122 Section 4.1.3: Definições de versões UUID
Suporte de linguagens de programação
- JavaScript:
crypto.randomUUID()(Node.js 14.17+) - Python: Módulo
uuid - Java:
java.util.UUID - C#:
System.Guid
Última atualização: 20 de janeiro de 2024