Gerador CUID

Gera IDs únicos resistentes a colisões (CUID v1)

Quantidade

CUIDs gerados

Clique em Gerar para criar CUIDs

CUID v1 é um formato legado. Para novos projetos, use CUID2.

O que é CUID?

CUID (Identificador Único Resistente a Colisões) é um algoritmo de código aberto para gerar IDs únicos que funcionam bem em sistemas distribuídos sem um coordenador central. Ao contrário de um UUID simples, um CUID é projetado para ser horizontalmente escalável — múltiplos servidores ou abas do navegador podem gerar IDs de forma independente com risco mínimo de colisão.

Todo CUID começa com a letra minúscula c, tornando o formato imediatamente reconhecível de relance. Os caracteres restantes são todos alfanuméricos em minúsculas (base36), portanto um CUID é seguro para URLs e pode ser usado diretamente como segmento de caminho URL ou chave primária de banco de dados sem codificação adicional.

A especificação original do CUID (v1) foi criada por Eric Elliott e popularizada através do pacote npm cuid. Agora foi substituída pelo CUID v2, que fornece segurança criptográfica. Esta página — e o gerador acima — produz IDs CUID v1, o formato clássico ainda amplamente encontrado em bases de código em produção.

Estrutura do CUID

Um CUID v1 tem aproximadamente 25 caracteres de comprimento e é composto por cinco segmentos concatenados, cada um carregando um tipo diferente de entropia:

Exemplo: clrc4gkwz001ag2hs3k7f9m2q
cprefixoSempre a letra "c" — identifica um CUID
lrc4gkwztimestampTimestamp em milissegundos em base36 (~8 chars)
001acontadorContador base36 de 4 chars — evita colisões no mesmo milissegundo
g2hsimpressão digitalImpressão digital do host base36 de 4 chars (info do navegador/ambiente)
3k7f9m2qaleatórioBloco aleatório base36 de 8 chars — dois valores de 32 bits

Os segmentos são simplesmente concatenados — não há separadores. O comprimento total varia ligeiramente dependendo do valor atual do timestamp, mas permanece em aproximadamente 25 caracteres.

Como o CUID Previne Colisões

A resistência a colisões vem de superpor fontes independentes de entropia de modo que mesmo em cenários de pior caso (milhares de IDs gerados por milissegundo em muitas máquinas) a probabilidade de dois IDs idênticos permaneça extremamente pequena.

Timestamp em Milissegundos
O primeiro segmento codifica o tempo atual em base36. IDs gerados em momentos diferentes se ordenam automaticamente lexicograficamente por tempo de criação — útil para paginação e depuração.
Contador Monotônico
Dentro do mesmo processo, o contador de 4 chars incrementa a cada ID gerado. Mesmo que duas chamadas ocorram no mesmo milissegundo na mesma máquina, o contador garante unicidade para até 65.536 IDs por milissegundo.
Impressão Digital da Máquina
Um hash derivado de dados específicos do ambiente (ID de processo + hostname no Node.js; dimensões de tela + informações do navegador no navegador). Isso diferencia IDs gerados em hosts separados no mesmo milissegundo exato com o mesmo valor de contador.
Bloco Aleatório
Os 8 caracteres finais vêm de dois valores aleatórios de 32 bits independentes codificados em base36. Isso adiciona uma camada final de entropia que protege contra colisões mesmo que a impressão digital de duas máquinas resulte no mesmo valor.

CUID vs UUID v4

Tanto o CUID quanto o UUID v4 são amplamente usados para geração de IDs no lado do cliente. Eles adotam abordagens diferentes para o mesmo problema:

CaracterísticaCUID v1UUID v4
Formatoc + base36 (~25 chars)grupos hex (36 chars com hífens)
OrdenávelAproximadamente (prefixo de timestamp)Não
Seguro para URLSim (apenas alfanumérico)Principalmente (hífens são válidos em URLs)
Resistência a colisõesAlta — timestamp + contador + impressão digital + aleatórioAlta — 122 bits aleatórios
PrevisibilidadeParcialmente (timestamp visível)Nenhuma (puramente aleatório)
Comprimento~25 caracteres36 caracteres
Requer coordenaçãoNãoNão

UUID v4 é a escolha mais segura para cenários sensíveis à segurança porque não revela informações de tempo. CUID tem a vantagem quando você quer IDs vagamente ordenáveis, mais curtos e sem hífens — útil para uso em URLs, nomes de arquivo ou logs onde você quer identificar rapidamente quando um registro foi criado.

CUID v1 vs CUID2

A especificação CUID foi revisada significativamente. Entender as diferenças ajuda a escolher a versão certa para o seu projeto:

AspectoCUID v1CUID v2
AlgoritmoComponentes determinísticosBaseado em SHA-3, completamente opaco
CriptográficoNãoSim
Timestamp visívelSimNão
FormatoComeça com "c"Começa com "c" (configurável)
Pacote npm@paralleldrive/cuid (obsoleto)@paralleldrive/cuid2
Comprimento~25 chars24 chars (padrão, configurável)

Para novos projetos, CUID v2 é a escolha recomendada. Sua construção baseada em SHA-3 significa que a saída é opaca — nenhum timestamp, contador ou impressão digital pode ser engenharia reversa do ID. Use CUID v1 apenas quando precisar de compatibilidade retroativa com um conjunto de dados existente ou quiser uma implementação sem dependências.

Casos de Uso

Bancos de Dados Distribuídos
Múltiplos shards de banco de dados ou microsserviços podem gerar chaves primárias de forma independente sem uma tabela de sequências ou serviço central de IDs, eliminando um único ponto de falha.
Geração de ID no Lado do Cliente
Um navegador pode atribuir um CUID a um novo registro antes de enviá-lo ao servidor, habilitando atualizações otimistas de UI e eliminando a viagem de ida e volta necessária para obter um ID atribuído pelo servidor.
Apps Offline-First
Apps móveis ou PWA que operam sem conectividade podem criar registros com IDs estáveis que sobrevivem à sincronização — sem conflitos quando o dispositivo volta a se conectar.
Slugs de URL
CUIDs contêm apenas caracteres alfanuméricos, tornando-os seguros para incorporar diretamente em caminhos URL sem codificação percentual. O prefixo de timestamp adiciona uma ordenação aproximada por tempo de criação.
Correlação de Eventos / Logs
Como o timestamp está codificado no primeiro segmento, entradas de log marcadas com CUIDs podem ser ordenadas aproximadamente por tempo de criação mesmo em agregadores de log distribuídos.
ORM / Padrão do Prisma
O Prisma usa CUID como sua estratégia padrão @id para chaves primárias String — @default(cuid()) — tornando-o um dos formatos de ID mais amplamente implantados no ecossistema JavaScript.

Exemplos de Código

Instale o pacote oficial CUID v2 (recomendado) ou escreva uma implementação mínima de v1 sem dependências:

JavaScript / TypeScript
// npm install @paralleldrive/cuid2  (recommended — CUID v2)
import { createId } from '@paralleldrive/cuid2'

const id = createId()
// → 'tz4a98xxat96iws9zmbrgj3a'

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 10 })
createShortId() // → 'zxp1l6mf4c'

Se preferir uma implementação Node.js sem dependências do algoritmo v1:

Node.js (no dependencies)
// Pure Node.js — CUID v1 style (no dependencies)
let counter = 0

function pad(str, size) {
  return str.padStart(size, '0').slice(-size)
}

function fingerprint() {
  const os = require('os')
  const source = [process.pid, os.hostname().length].join('')
  let hash = 0
  for (const c of source) {
    hash = ((hash << 5) - hash) + c.charCodeAt(0)
    hash |= 0
  }
  return pad(Math.abs(hash).toString(36), 4)
}

function cuid() {
  const timestamp = Date.now().toString(36)
  const cnt       = pad((counter++ & 0xffff).toString(36), 4)
  const fp        = fingerprint()
  const rnd       = pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
              + pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
  return 'c' + timestamp + cnt + fp + rnd
}

console.log(cuid()) // → 'clrc4gkwz001ag2hs3k7f9m2q'

Usando CUID como chave primária de banco de dados com Prisma e PostgreSQL:

Prisma / SQL
-- Use CUID as a primary key in PostgreSQL
CREATE TABLE users (
  id   TEXT        PRIMARY KEY DEFAULT gen_cuid(),
  name TEXT        NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- Prisma schema (auto-generates CUID by default)
model User {
  id        String   @id @default(cuid())
  name      String
  createdAt DateTime @default(now())
}

Perguntas Frequentes

O CUID é seguro para URLs?
Sim. CUID v1 usa apenas letras minúsculas e dígitos (codificação base36), que são todos caracteres seguros para URLs. Nenhuma codificação percentual é necessária ao usar um CUID em um caminho URL ou parâmetro de consulta.
O CUID é criptograficamente seguro?
Não. CUID v1 usa Math.random() e expõe um prefixo de timestamp visível. Não é adequado para fins sensíveis à segurança como tokens de sessão ou links de redefinição de senha. Para esses casos de uso, use crypto.randomUUID() ou CUID v2.
CUID vs NanoID — qual devo escolher?
NanoID é criptograficamente seguro, mais curto (21 chars por padrão) e usa um alfabeto personalizável. Escolha NanoID quando a segurança importa ou quando precisa de um ID mais curto. Escolha CUID quando quiser um ID aproximadamente ordenável com prefixo de timestamp que seja depurável por humanos.
Devo usar CUID v1 ou CUID v2?
CUID v2 é a recomendação atual. É criptograficamente seguro, não vaza informações de tempo e é ativamente mantido. CUID v1 é útil quando você precisa de uma implementação simples sem dependências ou está mantendo um sistema legado. Este gerador produz IDs CUID v1.
CUID vs ULID — qual é a diferença?
Ambos têm prefixo de timestamp e são ordenáveis lexicograficamente. ULID usa Crockford base32 (128 bits no total, 48 bits de timestamp + 80 bits aleatórios), tornando-o ligeiramente mais aleatório. CUID adiciona uma impressão digital de máquina e um contador monotônico, o que melhora a resistência a colisões no mesmo host dentro do mesmo milissegundo. ULID ordena de forma mais confiável porque o timestamp ocupa a porção de ordem superior completa.
O CUID é garantidamente único?
Nenhum esquema de ID pode dar uma garantia matemática sem um coordenador central. CUID torna as colisões extremamente improváveis combinando quatro fontes independentes de entropia: o timestamp, um contador por processo, uma impressão digital de máquina e dados aleatórios. Na prática, as colisões são muito menos prováveis do que uma falha de hardware.