Gerador NanoID

Gera IDs únicos pequenos e seguros para URL com alfabeto personalizável

Alfabeto

Tamanho

Quantidade

Clique em Gerar para criar NanoIDs

O que é NanoID?

NanoID é um gerador de IDs aleatórios pequeno, rápido e seguro para URL. Por padrão produz strings de 21 caracteres usando um alfabeto de 64 caracteres (A-Za-z0-9_-), fornecendo aproximadamente 126 bits de entropia — comparável aos 122 bits do UUID v4, mas em uma string mais curta.

NanoID não incorpora um timestamp ou qualquer dado estruturado. Cada ID é puramente aleatório, gerado a partir do gerador de números aleatórios criptograficamente seguro do sistema operacional (crypto.getRandomValues() em navegadores, crypto.randomBytes() no Node.js).

NanoID vs UUID v4

NanoID e UUID v4 são ambos geradores de IDs aleatórios apoiados por um CSPRNG. Eles diferem em formato, comprimento e suporte de ecossistema:

PropriedadeNanoID (padrão)UUID v4
FormatoAlfanumérico seguro para URL + _-Hexadecimal com hífens
Comprimento21 caracteres (padrão)36 caracteres
Entropia~126 bits122 bits
Seguro para URLSim — sem codificação necessáriaSim (com hífens)
Alfabeto64 caracteres (A-Za-z0-9_-)16 caracteres (0-9a-f)
DependênciasRequer pacote npmNativo (crypto.randomUUID)
PersonalizávelSim — comprimento e alfabetoNão
PadrãoNenhum (biblioteca comunitária)RFC 4122 / RFC 9562

Escolha UUID v4 quando a interoperabilidade com sistemas externos importa — bancos de dados com colunas UUID nativas, APIs esperando formato UUID, ou infraestrutura de log que analisa UUIDs. Escolha NanoID quando quiser IDs mais curtos e controlar toda a stack.

Probabilidade de Colisão por Tamanho

A probabilidade de colisão do NanoID depende do comprimento do ID e da taxa de geração. A tabela a seguir usa o alfabeto padrão de 64 caracteres:

Tamanho (chars)IDs possíveisSegurança de colisão
664~1 em 4,5B — seguro para alguns milhares de IDs
864~1 em 4,5T — seguro para milhões de IDs
1164~1 em 2,8 quatrilhões — seguro para bilhões de IDs
1664~1 em 1,2 × 10^19 — seguro para trilhões de IDs
2164~1 em 10^30 — seguro para 100 bilhões de IDs por dia por séculos
3264Comparável ao UUID v4 (122 bits)
3636Supera UUID v4

O tamanho padrão de 21 caracteres é escolhido para corresponder à resistência a colisões do UUID v4 (~126 bits) sendo 41% mais curto. Para a maioria das aplicações, 21 caracteres é a escolha certa.

Alfabetos Personalizados

O alfabeto do NanoID é totalmente personalizável. A biblioteca aceita qualquer string de caracteres únicos como alfabeto e gera IDs usando apenas esses caracteres:

Apenas numéricoA-Za-z0-9_-
Use '0123456789' para IDs que sejam todos dígitos — útil para códigos SMS ou identificadores estilo PIN.
Hexadecimal em minúsculasA-Za-z0-9
Use '0123456789abcdef' para strings hexadecimais compactas sem o formato de hífens UUID.
Legível para humanos0-9a-f
Exclua caracteres visualmente ambíguos (0, O, 1, I, l) para IDs que os usuários podem precisar digitar manualmente.
Domínio personalizado0-9
Use qualquer conjunto de caracteres apropriados para sua aplicação — ex.: apenas vogais+consoantes para IDs pronunciáveis.

Importante: use nanoid/non-secure apenas para aplicações não sensíveis à segurança (ex.: IDs de elementos UI). Para qualquer ID que precise ser impossível de adivinhar, sempre use a importação segura padrão.

Como NanoID Gera Aleatoriedade

NanoID usa o gerador de números pseudoaleatórios criptograficamente seguro (CSPRNG) do sistema operacional. Em navegadores é crypto.getRandomValues(); no Node.js é crypto.randomFillSync(). Esta é a mesma fonte de entropia usada para chaves de sessão TLS — muito mais forte que Math.random().

Amostragem por Rejeição (Evitando Viés de Módulo)

Uma abordagem ingênua para gerar caracteres aleatórios seria: pegar um byte aleatório (0–255) e calcular byte % alphabetSize. Isso introduz o viés de módulo — alguns caracteres aparecem ligeiramente mais frequentemente que outros quando o tamanho do alfabeto não divide uniformemente 256.

NanoID elimina esse viés usando amostragem por rejeição:

  1. Determine a menor máscara de potência de dois que cubra o tamanho do alfabeto (ex.: para um alfabeto de 64 chars, a máscara é 63 = 0b00111111)
  2. Gere bytes aleatórios e aplique a máscara: byte & mask
  3. Se o valor mascarado estiver dentro do intervalo do alfabeto, use-o. Caso contrário, descarte e tente novamente.

Isso significa que alguns bytes aleatórios são descartados, mas o resultado é uma distribuição perfeitamente uniforme sobre o alfabeto — nenhum caractere é mais provável que outro.

How the algorithm works — step by step
// Pure browser — no npm package needed
function generateNanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = crypto.getRandomValues(new Uint8Array(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) {
        id += alphabet[idx]
        if (id.length === size) break
      }
    }
  }
  return id
}

const URL_SAFE = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
generateNanoid(URL_SAFE, 21)  // → "V1StGXR8_Z5jdHi6B-myT"

Suporte de Ambiente

Browser
Navegadores modernos (Chrome 37+, Firefox 34+, Safari 7+) — usa crypto.getRandomValues()
Node.js 14+
Node.js 14.18+ — usa crypto.randomFillSync()
Deno
Deno — usa crypto.getRandomValues()
Bun
React Native — usa o polyfill expo-crypto ou react-native-get-random-values
Edge / Cloudflare Workers
Ambientes edge (Cloudflare Workers, Vercel Edge) — Web Crypto API disponível
React Native
Bun — suporte nativo a crypto

Exemplos de Código

JavaScript / TypeScript

JavaScript
// npm i nanoid
import { nanoid } from 'nanoid'
nanoid()          // → "V1StGXR8_Z5jdHi6B-myT" (21 chars, URL-safe)
nanoid(8)         // → "Uakgb_J5" (custom size)

// Custom alphabet
import { customAlphabet } from 'nanoid'
const hexId  = customAlphabet('0123456789abcdef', 16)
hexId()       // → "4f3a1b8c9d2e0f7a"

const numId  = customAlphabet('0123456789', 8)
numId()       // → "30812894"

Navegador (CDN)

NanoID pode ser usado diretamente no navegador via importação CDN. Nenhuma etapa de build necessária para prototipagem rápida.

JavaScript
// Pure browser — no npm package needed
function generateNanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = crypto.getRandomValues(new Uint8Array(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) {
        id += alphabet[idx]
        if (id.length === size) break
      }
    }
  }
  return id
}

const URL_SAFE = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
generateNanoid(URL_SAFE, 21)  // → "V1StGXR8_Z5jdHi6B-myT"

Python

Python
# pip install nanoid
from nanoid import generate

generate()              # → "V1StGXR8_Z5jdHi6B-myT"
generate(size=8)        # → "Uakgb_J5"
generate('0123456789abcdef', 16)  # custom alphabet + size

Node.js (CommonJS)

JavaScript
// Node.js — stdlib only, no npm needed
const { randomFillSync } = require('crypto')

function nanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = randomFillSync(Buffer.alloc(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) { id += alphabet[idx]; if (id.length === size) break }
    }
  }
  return id
}

Perguntas Frequentes

NanoID é criptograficamente seguro?
Sim — ao usar a importação padrão, NanoID gera IDs usando o CSPRNG em nível de SO (crypto.getRandomValues em navegadores, crypto.randomFillSync no Node.js). Esta é a mesma fonte de entropia usada para geração de chaves criptográficas. Valores NanoID são adequados para tokens de sessão, chaves API e outros identificadores sensíveis à segurança.
Posso usar NanoID como chave primária de banco de dados?
Sim. Strings NanoID são seguras para URL e podem ser armazenadas como colunas CHAR ou VARCHAR. No entanto, NanoID não tem componente de timestamp, portanto IDs não são ordenáveis por ordem de geração — isso causará fragmentação de índice B-tree a altas taxas de inserção, semelhante ao UUID v4. Para chaves primárias ordenadas por tempo, use ULID ou UUID v7 em vez disso.
Como NanoID se compara com crypto.randomUUID()?
Ambos usam um CSPRNG e fornecem forte aleatoriedade. crypto.randomUUID() é nativo (sem dependência), produz strings UUID v4 com hífens de 36 caracteres e é universalmente reconhecido por bancos de dados e APIs. NanoID requer um pacote npm, mas produz strings mais curtas (21 chars padrão) com um alfabeto personalizável. Para a maioria dos casos, prefira crypto.randomUUID() para evitar uma dependência.
O que acontece se eu usar um NanoID muito curto?
IDs curtos (ex.: 6–8 caracteres) têm probabilidade de colisão significativamente maior. Um NanoID de 6 caracteres do alfabeto padrão de 64 chars tem apenas ~68 bilhões de valores possíveis — adequado para alguns milhares de IDs antes que o risco de colisão se torne não trivial. Use a tabela de probabilidade de colisão acima para escolher um tamanho apropriado para seu volume esperado de IDs.
Posso usar NanoID em um navegador sem npm?
Sim. NanoID suporta importações ESM de CDN (ex.: jsDelivr ou esm.sh). Importe-o como módulo em uma tag script com type="module". Isso é útil para prototipagem rápida, mas não recomendado para produção — fixe a uma versão específica e considere hospedar o script você mesmo.
NanoID funciona em todos os ambientes?
NanoID funciona em todos os navegadores modernos, Node.js, Deno, Bun, Cloudflare Workers e Vercel Edge Functions. Para React Native, um polyfill para getRandomValues é necessário (react-native-get-random-values). A biblioteca é projetada para ser agnóstica ao ambiente e detecta a API crypto disponível automaticamente.