UUID v4 em JavaScript — Guia Completo

·TypeScript & Full-stack Developer·Revisado porMarcus Webb·Publicado

Use o Gerador UUID v4 gratuito diretamente no seu navegador — sem instalação.

Experimentar Gerador UUID v4 online →

Toda aplicação JavaScript eventualmente precisa de identificadores únicos — tokens de sessão, linhas de banco de dados, chaves de idempotência para APIs de pagamento, IDs de correlação para rastreamento distribuído. A maneira mais simples de gerar UUID v4 em JavaScript hoje é crypto.randomUUID(): zero dependências, uma linha, criptograficamente seguro. UUID v4 é amplamente utilizado precisamente porque não requer coordenação entre serviços — cliente e servidor podem gerar IDs de forma independente sem risco de colisão. Este guia cobre essa API nativa, o pacote uuid npm, validação — tudo no Node.js 19+ e navegadores modernos. Para uma opção sem código, o Gerador UUID v4 no ToolDeck produz identificadores compatíveis instantaneamente.

  • crypto.randomUUID() é nativo em navegadores e Node.js — zero dependências, uma linha de código.
  • UUID v4 é um identificador aleatório de 128 bits: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y é 8, 9, a ou b).
  • Valide com /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i — verifica os bits de versão e variante.
  • O pacote uuid npm adiciona suporte a v1, v3, v5 e v7 quando você precisa de mais do que IDs aleatórios.
  • Para chaves primárias de banco de dados, prefira UUID v7 (ordenado por tempo) em vez do v4 (aleatório) para reduzir a fragmentação do índice.

O que é UUID v4?

Um UUID (Identificador Universalmente Único) versão 4 é um identificador aleatório de 128 bits formatado como 32 dígitos hexadecimais separados por quatro hífens: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. O 4 na posição 15 marca a versão. O caractere y na posição 20 é um de 8, 9, a, ou b (a variante RFC 4122). Os 122 bits restantes são aleatórios. UUID v4 é a versão mais comum em aplicações JavaScript porque não requer coordenação entre sistemas — você pode gerar IDs de forma independente no cliente e no servidor sem se preocupar com colisões.

Before · javascript
After · javascript
// Sem identificador
const event = { action: "user.login", ts: 1711824000 };
// Com UUID v4
const event = {
  id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  action: "user.login",
  ts: 1711824000
};

crypto.randomUUID() — A Abordagem Nativa do JavaScript

crypto.randomUUID() está disponível no Chrome 92+, Firefox 95+, Safari 15.4+ e Node.js 19+ (com suporte experimental a partir do Node.js 14.17.0 via globalThis.crypto). Retorna uma string UUID v4 minúscula de 36 caracteres. Nenhuma importação é necessária em JavaScript no navegador. No Node.js, você pode chamá-lo diretamente no objeto global cryptoou importá-lo explicitamente do módulo node:crypto.

JavaScript — navegador (zero importações)
// Funciona em qualquer navegador moderno — sem build step, sem bundler
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

// Use onde precisar de um identificador único
const telemetryEvent = {
  event_id: crypto.randomUUID(),
  action: "checkout.started",
  session_id: crypto.randomUUID(),
  timestamp: Date.now(),
  cart_total_cents: 14999,
};
console.log(JSON.stringify(telemetryEvent, null, 2));
Node.js — duas abordagens equivalentes
// Abordagem 1: crypto global (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// Abordagem 2: importação explícita de node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"

Detectar recursos do crypto.randomUUID vale a pena se seu código pode rodar em navegadores mais antigos ou WebViews embarcados. A verificação é uma única guarda typeof:

JavaScript — detecção de recursos com fallback
function generateUUIDv4() {
  // Prefere a API nativa quando disponível
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  // Fallback manual usando getRandomValues (veja a próxima seção)
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Define versão (4) e variante (RFC 4122)
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // versão 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variante 10xx

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return [
    hex.slice(0, 4).join(''),
    hex.slice(4, 6).join(''),
    hex.slice(6, 8).join(''),
    hex.slice(8, 10).join(''),
    hex.slice(10, 16).join(''),
  ].join('-');
}

console.log(generateUUIDv4());
// "9b2e4f1a-7c3d-4e8f-a5b6-0d2c1e9f8a7b"
Nota:Em contextos seguros (páginas HTTPS, localhost, extensões de navegador), crypto.randomUUID() está sempre disponível. Ele lança um erro em páginas HTTP não seguras em alguns navegadores. Se sua aplicação rodar em HTTP simples durante o desenvolvimento, o fallback com getRandomValues acima trata esse caso.

Gerar UUID v4 Sem uma Biblioteca

Às vezes você não pode depender de crypto.randomUUID() — talvez você esteja mirando uma WebView que remove a API crypto, ou você precisa entender o que acontece internamente. A abordagem manual usa crypto.getRandomValues() (disponível desde o IE 11) para preencher 16 bytes com dados aleatórios, depois aplica duas operações de bitmask para definir os campos de versão e variante. Essas duas operações são a única diferença entre UUID v4 e uma string de bytes puramente aleatória.

JavaScript — UUID v4 manual com getRandomValues
function uuidv4Manual() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Define versão: bits 12–15 do byte 6 = 0100 (versão 4)
  bytes[6] = (bytes[6] & 0x0f) | 0x40;

  // Define variante: bits 6–7 do byte 8 = 10 (RFC 4122)
  bytes[8] = (bytes[8] & 0x3f) | 0x80;

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));

  return (
    hex.slice(0, 4).join('') + '-' +
    hex.slice(4, 6).join('') + '-' +
    hex.slice(6, 8).join('') + '-' +
    hex.slice(8, 10).join('') + '-' +
    hex.slice(10, 16).join('')
  );
}

const traceId = uuidv4Manual();
console.log(traceId);
// "e4d7c2a1-3f9b-48e5-a612-9d8c7b6a5f4e"

// Verifica se passa na validação UUID v4
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
console.log(UUID_V4_RE.test(traceId)); // true
Aviso:Nunca use Math.random() para gerar UUIDs. Ele não é criptograficamente seguro, seu período de saída é muito curto, e alguns engines produzem sequências previsíveis. Sempre use crypto.getRandomValues() ou crypto.randomUUID().

O Pacote uuid npm — Suporte a Múltiplas Versões

O pacote uuid no npm tem sido a biblioteca UUID de referência para JavaScript desde antes de crypto.randomUUID() existir. Ainda faz sentido em três situações: você precisa de versões UUID diferentes do v4 (v1, v3, v5, v7), você tem como alvo runtimes anteriores ao Node.js 14.17.0, ou você quer as funções utilitárias validate e parse. Para UUID v4 simples em um runtime moderno, a API nativa é suficiente e eu dispensaria a dependência.

bash — instalar
npm install uuid
JavaScript — pacote uuid para geração v4
import { v4 as uuidv4, validate, version } from 'uuid';

// Gera um UUID v4
const paymentId = uuidv4();
console.log(paymentId);
// "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"

// Valida qualquer string UUID
console.log(validate(paymentId));    // true
console.log(validate("not-a-uuid")); // false

// Detecta a versão de um UUID
console.log(version(paymentId));     // 4

// Gera um lote para semear um banco de dados de teste
const testAccounts = Array.from({ length: 5 }, () => ({
  account_id: uuidv4(),
  plan: "starter",
  created_at: new Date().toISOString(),
}));
console.log(testAccounts);
Nota:O pacote uuid usa internamente crypto.getRandomValues() em navegadores e crypto.randomBytes() no Node.js, então a fonte de entropia é idêntica à API nativa. A diferença são apenas as funções utilitárias adicionais e o suporte a múltiplas versões.

Se preferir não escrever código algum, experimente o Gerador UUID v4 — ele gera identificadores v4 compatíveis com RFC 4122 diretamente no seu navegador com um clique.

UUIDs Determinísticos — Gerando UUID v5 a partir de uma String

UUID v4 é aleatório por definição — chamá-lo duas vezes sempre produz resultados diferentes. Às vezes você precisa do oposto: a mesma string de entrada deve sempre produzir o mesmo UUID. É isso que UUID v5 faz. Ele aplica hash de um UUID de namespace e uma string de entrada com SHA-1, depois formata o resultado como um UUID. Mesmo namespace + mesma entrada = mesma saída, sempre, em qualquer máquina. Isso é útil para derivar IDs estáveis a partir de URLs, endereços de e-mail ou qualquer string que já identifique um recurso.

JavaScript — uuid v5 para IDs determinísticos
import { v5 as uuidv5 } from 'uuid';

// Namespace nativo para URLs (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

// A mesma URL sempre produz o mesmo UUID
const pageId1 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
const pageId2 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
console.log(pageId1 === pageId2); // true
console.log(pageId1);
// "a6e4e1c0-7e23-5d3b-8f14-9c2a1b3d5e7f"

// Namespace customizado para sua aplicação
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"

Nota rápida: UUID v3 faz a mesma coisa, mas com MD5 em vez de SHA-1. Prefira v5 para novos projetos. MD5 tem fraquezas de colisão conhecidas, e embora isso não importe muito para geração de IDs, não há razão para escolhê-lo em vez de SHA-1 quando ambos estão disponíveis.

Referência de crypto.randomUUID() e APIs Relacionadas

O nativo crypto.randomUUID() não aceita argumentos — ele retorna uma string e nada mais. Use-o quando precisar de identificadores compatíveis com RFC 4122 sem dependências. Quando você precisar de bytes aleatórios brutos em vez de uma string UUID formatada — por exemplo, para preencher um typed array ou derivar uma chave — use crypto.getRandomValues() diretamente. As APIs relacionadas que importam para trabalho com UUID estão listadas abaixo.

Propriedade / Método
Tipo de Retorno
Descrição
crypto.randomUUID()
string
Retorna uma string UUID v4 de 36 caracteres em hexadecimal minúsculo com hífens
crypto.getRandomValues(arr)
TypedArray
Preenche um typed array com valores aleatórios criptograficamente seguros — o bloco fundamental para geração manual de UUIDs
URL.createObjectURL(blob)
string
Gera uma URL de blob única (não é um UUID, mas às vezes confundida com um)

Detalhamento do padrão regex UUID v4:

Segmento
Padrão
Significado
[0-9a-f]{8}
xxxxxxxx
Primeiros 8 dígitos hex — 32 bits aleatórios
[0-9a-f]{4}
xxxx
Próximos 4 dígitos hex — 16 bits aleatórios
4[0-9a-f]{3}
4xxx
Nibble de versão fixo em 4, seguido de 12 bits aleatórios
[89ab][0-9a-f]{3}
yxxx
Nibble de variante é um de 8, 9, a, b — seguido de 12 bits aleatórios
[0-9a-f]{12}
xxxxxxxxxxxx
Últimos 12 dígitos hex — 48 bits aleatórios

Validar UUID v4 com Regex

Validar que uma string é um UUID v4 adequado aparece constantemente — corpos de requisição de API, parâmetros de URL, payloads de webhook. Uma regex feita à mão é a escolha certa quando você quer zero dependências e está validando apenas v4. Se você já está usando o pacote uuid, prefira seu export validate() — ele trata todas as versões de UUID e é menos propenso a erros do que manter um padrão customizado. A regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i verifica tanto o nibble de versão (deve ser 4) quanto o nibble de variante (deve ser 8, 9, a, ou b). Use RegExp.prototype.test() para verificações booleanas e .match() quando precisar extrair um UUID de um texto ao redor.

JavaScript — helper de validação UUID v4
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

function isUUIDv4(str) {
  return UUID_V4_RE.test(str);
}

// UUID v4 válido
console.log(isUUIDv4("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d")); // true

// UUID v1 — nibble de versão é 1, não 4
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false

// UUID v7 — nibble de versão é 7
console.log(isUUIDv4("018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b")); // false

// Strings malformadas
console.log(isUUIDv4("not-a-uuid"));           // false
console.log(isUUIDv4(""));                      // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (sem hífens)

// Extrai UUID de uma string maior
const logLine = 'Request req_id=9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d failed with 503';
const match = logLine.match(/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i);
console.log(match?.[0]);
// "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

Gerar e Anexar UUIDs a partir de Arquivo e Resposta de API

Na prática, você raramente chama crypto.randomUUID() de forma isolada. Dois padrões aparecem constantemente: atribuir IDs a registros antes de escrevê-los em um banco de dados, e anexar IDs de correlação a requisições de API de saída para rastrear uma requisição entre serviços nos seus logs.

Ler Arquivo NDJSON → Atribuir UUIDs → Gravar de Volta

Node.js — atribuir UUIDs a registros de um arquivo
import { readFileSync, writeFileSync } from 'node:fs';
import { randomUUID } from 'node:crypto';

function assignIds(inputPath, outputPath) {
  const lines = readFileSync(inputPath, 'utf-8')
    .split('\n')
    .filter(line => line.trim());

  const records = lines.map(line => {
    try {
      const record = JSON.parse(line);
      if (!record.id) {
        record.id = randomUUID();
      }
      return JSON.stringify(record);
    } catch (err) {
      console.error(`Pulando linha malformada: ${err.message}`);
      return null;
    }
  }).filter(Boolean);

  writeFileSync(outputPath, records.join('\n') + '\n');
  console.log(`IDs atribuídos a ${records.length} registros → ${outputPath}`);
}

assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// IDs atribuídos a 1284 registros → warehouse-products-with-ids.ndjson

Anexar ID de Correlação a Requisição de API de Saída

Node.js — ID de correlação para rastreamento distribuído
import { randomUUID } from 'node:crypto';

async function createShipment(orderPayload) {
  const correlationId = randomUUID();

  try {
    const response = await fetch('https://api.logistics.dev/v2/shipments', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-Correlation-ID': correlationId,
        'X-Idempotency-Key': randomUUID(),
      },
      body: JSON.stringify(orderPayload),
    });

    if (!response.ok) {
      const errorBody = await response.text();
      throw new Error(`Shipment API returned ${response.status}: ${errorBody}`);
    }

    const result = await response.json();
    console.log(`Envio criado: ${result.shipment_id} (correlação: ${correlationId})`);
    return result;
  } catch (err) {
    console.error(`[correlação:${correlationId}] Envio falhou: ${err.message}`);
    throw err;
  }
}

await createShipment({
  order_id: "ord_8a3f91bc",
  destination: { city: "São Paulo", state: "SP", zip: "01310-100" },
  items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});

Geração de UUID pela Linha de Comando

Você nem sempre precisa de um script. O Node.js pode gerar um UUID diretamente pela linha de comando, o que é útil para scripts shell, pipelines de CI e testes ad-hoc rápidos. O flag -e avalia uma única expressão.

bash — gerar UUID pela linha de comando
# UUID único
node -e "console.log(crypto.randomUUID())"
# 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f

# Cinco UUIDs de uma vez
node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())"

# Gera e atribui a uma variável shell
export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())")
echo "Request ID: $REQUEST_ID"

# Usa npx uuid (se você tiver o pacote instalado globalmente ou quiser um uso único)
npx uuid v4
# 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
bash — gerar UUID no console do navegador (sem Node.js)
# Abra o DevTools de qualquer navegador e digite:
crypto.randomUUID()
# "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
Nota:Se você precisa de UUIDs em um pipeline de CI e o Node.js não está disponível, uuidgen vem pré-instalado no macOS e na maioria das distribuições Linux. Ele gera UUID v4 por padrão em sistemas modernos.

Alternativa de Alto Desempenho — nanoid

Se você está gerando milhares de IDs por segundo e o formato UUID de 36 caracteres não é um requisito obrigatório, considere nanoid. É 2x mais rápido que uuid.v4(), produz um ID URL-safe de 21 caracteres por padrão e pesa cerca de 1 KB após minificação. A saída não é um UUID — é um ID de alfabeto customizado — então não o use onde a conformidade com RFC 4122 é exigida (colunas UUID de banco de dados, APIs que validam formato UUID, IDs de trace do OpenTelemetry). Mas para IDs de correlação internos, chaves de componentes React e slugs de URL, é uma boa escolha.

bash — instalar nanoid
npm install nanoid
JavaScript — nanoid para IDs únicos curtos
import { nanoid, customAlphabet } from 'nanoid';

// Padrão: ID URL-safe de 21 chars (A-Za-z0-9_-)
const trackingCode = nanoid();
console.log(trackingCode);
// "V1StGXR8_Z5jdHi6B-myT"

// Comprimento customizado
const shortCode = nanoid(10);
console.log(shortCode);
// "IRFa-VaY2b"

// Alfabeto customizado — apenas números, 12 dígitos
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"

// Alfabeto customizado — apenas hex, 32 chars (mesma entropia que UUID v4 sem hífens)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"

Saída no Terminal com Destaque de Sintaxe

Depurar aplicações com muitos UUIDs significa encarar paredes de strings hexadecimais no terminal. Coloração ajuda. A biblioteca chalk (ou o mais recente node:util styleText nativo no Node.js 21.7+) permite destacar UUIDs na saída de log para que se destaquem do texto ao redor.

Node.js — saída UUID colorida com chalk
import chalk from 'chalk';
import { randomUUID } from 'node:crypto';

function logEvent(action, metadata = {}) {
  const eventId = randomUUID();
  const timestamp = new Date().toISOString();

  console.log(
    chalk.gray(timestamp),
    chalk.cyan(eventId),
    chalk.white(action),
    Object.keys(metadata).length
      ? chalk.dim(JSON.stringify(metadata))
      : ''
  );
}

logEvent('shipment.created', { order_id: 'ord_8a3f', carrier: 'fedex' });
logEvent('payment.captured', { amount_cents: 14999, currency: 'USD' });
logEvent('webhook.delivered', { endpoint: 'https://hooks.acme.dev/orders' });
// 2026-03-27T10:15:00.000Z  a1b2c3d4-...  shipment.created  {"order_id":"ord_8a3f",...}
Aviso:Códigos de escape de cor corrompem arquivos de log e quebram parsers JSON. Use chalk ou styleText apenas para saída de terminal lida diretamente por humanos. Para logs estruturados que vão para um arquivo ou agregador de logs, use JSON simples.

Gerar IDs Únicos Curtos em JavaScript

Um UUID de 36 caracteres às vezes é longo demais — slugs de URL, dados de QR code, mensagens SMS e protocolos de hardware embarcado têm restrições de comprimento.

JavaScript — três técnicas para IDs mais curtos
import { randomUUID } from 'node:crypto';

// 1. Remove hífens do UUID v4 → string hex de 32 chars
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 chars)

// 2. Codifica 16 bytes aleatórios em Base64 → string de 22 chars (URL-safe)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const base64Id = Buffer.from(bytes)
  .toString('base64url')
  .replace(/=+$/, '');
console.log(base64Id);
// "Pj8akksNTY6fEnarPIvR" (22 chars, 128 bits de entropia)

// 3. nanoid com comprimento customizado
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 chars, ~71 bits de entropia)

A matemática de probabilidade de colisão: um nanoid de 12 caracteres (alfabeto padrão de 64 caracteres) fornece aproximadamente 71 bits de entropia. A 1.000 IDs por segundo, você levaria cerca de 116 anos para atingir 1% de probabilidade de colisão. Para a maioria das aplicações, isso é mais do que suficiente. Se você está gerando milhões de IDs por dia, use o UUID completo ou nanoid com pelo menos 21 caracteres.

UUID v7 — Alternativa Ordenada por Tempo ao v4

UUID v7 (definido no RFC 9562) embute um timestamp Unix de 48 bits em milissegundos no primeiro segmento, seguido de bits aleatórios. O resultado é um UUID que parece similar ao v4, mas ordena cronologicamente. Isso o torna uma escolha melhor que o v4 para chaves primárias de banco de dados: novas linhas sempre vão para o final do índice B-tree em vez de posições aleatórias, o que reduz divisões de página e fragmentação. Em projetos onde preciso de IDs ordenados por tempo para uma tabela Postgres, mudo para v7 imediatamente — a diferença de desempenho do índice é mensurável em escala. O Gerador UUID v7 no ToolDeck mostra o timestamp embutido para qualquer UUID v7.

JavaScript — UUID v7 com o pacote uuid
import { v7 as uuidv7 } from 'uuid';

// Gera três valores UUID v7 — observe que ordenam cronologicamente
const id1 = uuidv7();
const id2 = uuidv7();
const id3 = uuidv7();

console.log(id1);
// "018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b"
console.log(id2);
// "018e4a0c-5b40-7e34-9c2d-1e4f5a6b7c8d"
console.log(id3);
// "018e4a0c-5b41-7f56-ae3f-2a5b6c7d8e9f"

// Eles ordenam lexicograficamente por tempo de criação
console.log([id3, id1, id2].sort());
// [id1, id2, id3] — ordem cronológica preservada

// Use v4 para tokens onde o tempo não deve ser revelado
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // totalmente aleatório, sem info de tempo
Nota:O pacote uuid suporta v7 a partir da versão 9.0.0. Se você está em uma versão mais antiga, execute npm install uuid@latest para atualizar.

UUID v4 no Navegador Sem Build Step

Sem bundler, sem npm, sem transpilador. Apenas um arquivo HTML simples. Esta é a maneira mais simples possível de gerar um UUID em JavaScript do lado do cliente. Funciona porque crypto.randomUUID() é uma API nativa do navegador.

HTML — gerador UUID mínimo no navegador
<!DOCTYPE html>
<html lang="pt">
<head><meta charset="utf-8"><title>Gerador UUID</title></head>
<body>
  <p>Seu UUID: <strong id="output"></strong></p>
  <button onclick="document.getElementById('output').textContent = crypto.randomUUID()">
    Gerar
  </button>
  <script>
    // Gera um ao carregar a página
    document.getElementById('output').textContent = crypto.randomUUID();
  </script>
</body>
</html>

É esse o arquivo completo. Sem importações de CDN, sem tags de script puxando bibliotecas. Para qualquer coisa mais complexa — geração em lote, validação, IDs determinísticos — você vai querer o pacote uuid ou o fallback manual mostrado anteriormente. Mas para um protótipo rápido ou ferramenta interna, isso é tudo que você precisa.

Erros Comuns

Já vi o padrão UUID com Math.random() copiado de posts antigos de blog para código de produção mais vezes do que gostaria de admitir. Os bugs que esses padrões introduzem são silenciosos: nenhum erro em runtime, apenas comportamento sutilmente errado que aparece mais tarde sob carga ou em revisões de segurança.

Usar Math.random() para gerar UUIDs

Problema: Math.random() não é criptograficamente seguro. Sua saída é previsível em alguns engines, e a baixa entropia torna colisões muito mais prováveis do que com um CSPRNG adequado.

Solução: Sempre use crypto.randomUUID() ou crypto.getRandomValues(). Ambos usam o CSPRNG do sistema operacional.

Before · JavaScript
After · JavaScript
// INSEGURO — previsível, baixa entropia
function badUuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
    /[xy]/g,
    c => {
      const r = Math.random() * 16 | 0;
      return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    }
  );
}
// SEGURO — usa o CSPRNG do SO
const id = crypto.randomUUID();

// Ou se precisar de um fallback manual:
function secureUuid() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  bytes[6] = (bytes[6] & 0x0f) | 0x40;
  bytes[8] = (bytes[8] & 0x3f) | 0x80;
  const h = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return `${h.slice(0,4).join('')}-${h.slice(4,6).join('')}-${h.slice(6,8).join('')}-${h.slice(8,10).join('')}-${h.slice(10).join('')}`;
}
Comparar UUIDs com igualdade sensível a maiúsculas/minúsculas

Problema: crypto.randomUUID() retorna hex minúsculo, mas UUIDs de outros sistemas (bancos de dados, APIs, entrada do usuário) podem usar maiúsculas. Comparação direta com === falha quando os casos diferem.

Solução: Normalize ambos os lados para minúsculas antes de comparar.

Before · JavaScript
After · JavaScript
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // maiúsculas da API
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";  // minúsculas do crypto

if (fromApi === local) { /* nunca executa */ }
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D";
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";

if (fromApi.toLowerCase() === local.toLowerCase()) {
  // corresponde corretamente
}
Armazenar UUIDs como objetos em vez de strings

Problema: Algumas bibliotecas UUID (especialmente em outras linguagens) retornam objetos UUID. Em JavaScript, envolver acidentalmente uma string UUID em um objeto quebra verificações de igualdade, serialização JSON e consultas ao banco de dados.

Solução: Sempre armazene e passe UUIDs como strings simples. Se uma biblioteca retornar um objeto, chame .toString() ou acesse a propriedade string imediatamente.

Before · JavaScript
After · JavaScript
// Criando wrapper desnecessário
class UUID {
  constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true, mas...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}
// Use apenas uma string
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}
Tratar UUID v4 como ordenável

Problema: UUID v4 é totalmente aleatório. Ordenar por UUID v4 produz ordem arbitrária, não ordem de criação. Isso leva a paginação imprevisível, UIs de administração confusas e mau desempenho de índice de banco de dados.

Solução: Use UUID v7 quando precisar de identificadores ordenados por tempo. Mantenha UUID v4 para tokens e IDs de correlação onde a ordem de classificação é irrelevante.

Before · JavaScript
After · JavaScript
// Ruim: usando v4 como chave primária ordenável
const rows = [
  { id: crypto.randomUUID(), created: "2026-03-27" },
  { id: crypto.randomUUID(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Ordem de classificação é aleatória — NÃO por data de criação
import { v7 as uuidv7 } from 'uuid';
// Bom: v7 ordena por tempo de criação
const rows = [
  { id: uuidv7(), created: "2026-03-27" },
  { id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Ordem de classificação corresponde ao tempo de criação

crypto.randomUUID() vs uuid vs nanoid — Comparação Rápida

Método
Formato de Saída
Versões UUID
Tamanho do Bundle
Tipos Customizados
Requer Instalação
crypto.randomUUID()
UUID v4 de 36 chars
Apenas v4
0 KB
N/A
Não (nativo)
pacote uuid npm
UUID de 36 chars
v1, v3, v4, v5, v6, v7
~6,5 KB
N/A
npm install
nanoid
ID URL-safe de 21 chars
Customizado (não é UUID)
~1 KB
N/A
npm install
Manual getRandomValues
UUID v4 de 36 chars
Apenas v4
0 KB
N/A
Não (nativo)
crypto.randomBytes (Node)
Buffer → UUID v4 de 36 chars
Apenas v4
0 KB
N/A
Não (nativo do Node)
pacote uuidv7 npm
UUID v7 de 36 chars
Apenas v7
~2 KB
N/A
npm install

Para a maioria dos projetos JavaScript: use crypto.randomUUID() quando você só precisa de UUID v4 e seu runtime é recente o suficiente. Use o pacote uuid quando precisar de suporte a v5 (determinístico) ou v7 (ordenado por tempo). Use nanoid quando um ID URL-safe curto é mais prático do que um UUID de 36 caracteres — mas lembre que a saída do nanoid não é compatível com UUID e falhará na validação em qualquer sistema que espere o formato RFC 4122.

Para uma alternativa sem código, experimente o Gerador UUID v4 para criar identificadores instantaneamente no navegador. Para inspecionar um UUID existente, cole-o no Decodificador UUID para ver sua versão, variante e quaisquer dados de timestamp embutidos.

Perguntas Frequentes

Como gerar um UUID v4 em JavaScript?

Chame crypto.randomUUID() em qualquer navegador moderno (Chrome 92+, Firefox 95+, Safari 15.4+) ou Node.js 19+. Ele retorna uma string minúscula como "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f". Nenhuma importação é necessária em navegadores porque crypto é um global nativo; no Node.js você também pode usar import { randomUUID } from "node:crypto" para ser explícito sobre o módulo. Para runtimes anteriores ao Node.js 19 você ainda pode chamar crypto.randomUUID() no global — estava disponível experimentalmente a partir do Node.js 14.17.0. Se você precisar de uma opção sem código, o Gerador UUID v4 em /en/uuid/v4 produz identificadores compatíveis com um clique.

JavaScript
const sessionId = crypto.randomUUID();
console.log(sessionId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

O crypto.randomUUID() é criptograficamente seguro?

Sim. crypto.randomUUID() usa o mesmo CSPRNG (gerador de números pseudoaleatórios criptograficamente seguro) que suporta crypto.getRandomValues(). Os 122 bits aleatórios em um UUID v4 tornam a probabilidade de colisão desprezível para todos os fins práticos — você precisaria gerar aproximadamente 2,71 quintilhões de UUIDs antes de atingir 50% de chance de uma única colisão. A entropia vem da fonte aleatória do sistema operacional (/dev/urandom no Linux, BCryptGenRandom no Windows), e não de Math.random(), que explicitamente não é criptograficamente seguro. Isso significa que os valores UUID v4 são seguros para uso como tokens de sessão, tokens CSRF e outros identificadores sensíveis à segurança onde a previsibilidade deve ser evitada. Nunca substitua geradores de UUID baseados em Math.random() em contextos de segurança.

Posso usar UUID v4 como chave primária de banco de dados?

Pode, mas há uma troca de desempenho significativa. UUID v4 é completamente aleatório, então índices B-tree fragmentam muito porque cada nova linha é inserida em uma posição aleatória do índice em vez do final. Em tabelas com muitas escritas, isso causa divisões excessivas de páginas e cache misses, degradando o desempenho de INSERT e varreduras por intervalo. Se seu banco de dados suportar (PostgreSQL, MySQL 8.0+, SQL Server), UUID v7 (ordenado por tempo) é uma chave primária melhor porque novas linhas sempre são adicionadas ao final do índice. UUID v4 continua sendo a escolha certa para tokens de sessão, parâmetros de estado OAuth, chaves de idempotência, IDs de correlação e qualquer campo onde ocultar o tempo de criação é desejável.

JavaScript
// UUID v4 — aleatório, não ordenável
const correlationId = crypto.randomUUID();

// UUID v7 — ordenado por tempo, melhor para chaves primárias de BD
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();

Qual é a diferença entre UUID v4 e UUID v7?

UUID v4 preenche 122 bits com dados aleatórios — cada segmento é efetivamente ruído. UUID v7 (RFC 9562, publicado em 2024) codifica um timestamp Unix de 48 bits em milissegundos no primeiro segmento, 12 bits de precisão sub-milissegundo no segundo segmento e bits aleatórios no restante. Ambos têm 128 bits no total e usam o mesmo formato hifenizado de 36 caracteres, então são intercambiáveis na camada de armazenamento. UUID v7 é ordenável lexicograficamente por tempo de criação, o que mantém os índices B-tree compactos e torna as consultas por intervalo de tempo eficientes. Escolha UUID v4 quando o ID não deve revelar quando foi criado — por exemplo, tokens públicos onde informações de tempo poderiam ser exploradas — e UUID v7 para chaves primárias de banco de dados, logs de auditoria e fluxos de eventos onde a ordem cronológica importa.

Como validar uma string UUID v4 em JavaScript?

Teste com a regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i. O "4" literal na posição 15 (indexado em 0) confirma o nibble de versão; o caractere na posição 20 — um de 8, 9, a ou b — codifica os bits de variante do RFC 4122. Esta regex corretamente rejeita UUID v1, v7 e qualquer string malformada. O flag i a torna insensível a maiúsculas/minúsculas, então dígitos hex maiúsculos de outros sistemas passam na validação sem normalização. Se você só precisa saber se uma string é um UUID válido qualquer (independente da versão), use o padrão mais amplo /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.

JavaScript
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

UUID_V4_RE.test("550e8400-e29b-41d4-a716-446655440000"); // true
UUID_V4_RE.test("550e8400-e29b-11d4-a716-446655440000"); // false (v1)
UUID_V4_RE.test("not-a-uuid"); // false

Como gerar um ID único curto em JavaScript?

Remova os hífens de um UUID v4 para obter uma string hex de 32 caracteres: crypto.randomUUID().replaceAll("-", ""). Para algo ainda menor, use nanoid que produz um ID URL-safe de 21 caracteres (A–Z, a–z, 0–9, _ e -) por padrão com resistência a colisões comparável a um UUID completo. A troca é direta: IDs mais curtos têm maior probabilidade de colisão, mas nanoid com 21 caracteres ainda fornece 126 bits de entropia, o que é mais do que suficiente para praticamente toda aplicação do mundo real. Para slugs de URL e dados de QR code você pode ir até 10–12 caracteres com nanoid antes de a probabilidade de colisão se tornar uma preocupação em taxas típicas de geração. Evite codificar em Base64 um UUID bruto e truncá-lo — o truncamento destrói a independência estatística dos bits e torna as colisões mais difíceis de analisar.

JavaScript
// String hex de 32 chars a partir de UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"

// ID URL-safe de 21 chars via nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"

Ferramentas Relacionadas

Também disponível em:Python
SL
Sophie LaurentTypeScript & Full-stack Developer

Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.

MW
Marcus WebbRevisor técnico

Marcus specialises in JavaScript performance, build tooling, and the inner workings of the V8 engine. He has spent years profiling and optimising React applications, working on bundler configurations, and squeezing every millisecond out of critical rendering paths. He writes about Core Web Vitals, JavaScript memory management, and the tools developers reach for when performance really matters.