w

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

  1. Chave primária de banco de dados: Usado como chave primária em bancos de dados distribuídos
  2. Identificação de arquivos: Identificar arquivos no sistema de arquivos
  3. Gerenciamento de sessão: Identificador de sessão em aplicações web
  4. Fila de mensagens: Identificação única de mensagens
  5. 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

  1. Uso geral: Usar UUID v4
  2. Ordenação temporal necessária: Usar UUID v1
  3. Determinismo necessário: Usar UUID v3 ou v5
  4. 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

Esta página foi útil?