Generador NanoID

Genera IDs únicos pequeños y seguros para URL con alfabeto personalizable

Alfabeto

Tamaño

Cantidad

Haz clic en Generar para crear NanoIDs

¿Qué es NanoID?

NanoID es un generador de IDs aleatorios pequeño, rápido y seguro para URL. Por defecto produce cadenas de 21 caracteres usando un alfabeto de 64 caracteres (A-Za-z0-9_-), proporcionando aproximadamente 126 bits de entropía — comparable a los 122 bits de UUID v4 pero en una cadena más corta.

NanoID no incorpora una marca de tiempo ni ningún dato estructurado. Cada ID es puramente aleatorio, generado a partir del generador de números aleatorios criptográficamente seguro del sistema operativo (crypto.getRandomValues() en navegadores, crypto.randomBytes() en Node.js).

NanoID vs UUID v4

NanoID y UUID v4 son ambos generadores de IDs aleatorios respaldados por un CSPRNG. Difieren en formato, longitud y soporte del ecosistema:

PropiedadNanoID (predeterminado)UUID v4
FormatoAlfanumérico seguro para URL + _-Hexadecimal con guiones
Longitud21 caracteres (predeterminado)36 caracteres
Entropía~126 bits122 bits
Seguro para URLSí — sin codificación necesariaSí (con guiones)
Alfabeto64 caracteres (A-Za-z0-9_-)16 caracteres (0-9a-f)
DependenciasRequiere paquete npmNativo (crypto.randomUUID)
PersonalizableSí — longitud y alfabetoNo
EstándarNinguno (biblioteca comunitaria)RFC 4122 / RFC 9562

Elija UUID v4 cuando la interoperabilidad con sistemas externos importa — bases de datos con columnas UUID nativas, APIs que esperan formato UUID, o infraestructura de registro que analiza UUIDs. Elija NanoID cuando quiera IDs más cortos y controle la pila completa.

Probabilidad de Colisión por Tamaño

La probabilidad de colisión de NanoID depende de la longitud del ID y la tasa de generación. La siguiente tabla usa el alfabeto de 64 caracteres predeterminado:

Tamaño (caracteres)IDs posiblesSeguridad de colisión
664~1 en 4.500M — seguro para unos pocos miles de IDs
864~1 en 4,5 billones — seguro para millones de IDs
1164~1 en 2,8 cuatrillones — seguro para miles de millones de IDs
1664~1 en 1,2 × 10^19 — seguro para billones de IDs
2164~1 en 10^30 — seguro para 100 mil millones de IDs por día durante siglos
3264Comparable a UUID v4 (122 bits)
3636Supera a UUID v4

El tamaño predeterminado de 21 caracteres se elige para coincidir con la resistencia a colisiones de UUID v4 (~126 bits) siendo un 41% más corto. Para la mayoría de las aplicaciones, 21 caracteres es la elección correcta.

Alfabetos Personalizados

El alfabeto de NanoID es completamente personalizable. La biblioteca acepta cualquier cadena de caracteres únicos como alfabeto y genera IDs usando solo esos caracteres:

Solo numéricoA-Za-z0-9_-
Use '0123456789' para IDs que sean todos dígitos — útil para códigos SMS o identificadores estilo PIN.
Hexadecimal en minúsculasA-Za-z0-9
Use '0123456789abcdef' para cadenas hexadecimales compactas sin el formato de guiones UUID.
Legible para humanos0-9a-f
Excluya caracteres visualmente ambiguos (0, O, 1, I, l) para IDs que los usuarios pueden necesitar escribir manualmente.
Dominio personalizado0-9
Use cualquier conjunto de caracteres apropiados para su aplicación — p. ej. solo vocales+consonantes para IDs pronunciables.

Importante: use nanoid/non-secure solo para aplicaciones no sensibles a la seguridad (p. ej. IDs de elementos UI). Para cualquier ID que deba ser imposible de adivinar, siempre use la importación segura predeterminada.

Cómo NanoID Genera Aleatoriedad

NanoID usa el generador de números pseudoaleatorios criptográficamente seguro (CSPRNG) del sistema operativo. En navegadores es crypto.getRandomValues(); en Node.js es crypto.randomFillSync(). Esta es la misma fuente de entropía usada para las claves de sesión TLS — mucho más fuerte que Math.random().

Muestreo por Rechazo (Evitando el Sesgo de Módulo)

Un enfoque ingenuo para generar caracteres aleatorios sería: tomar un byte aleatorio (0–255) y calcular byte % alphabetSize. Esto introduce el sesgo de módulo — algunos caracteres aparecen ligeramente más a menudo que otros cuando el tamaño del alfabeto no divide uniformemente 256.

NanoID elimina este sesgo usando el muestreo por rechazo:

  1. Determine la máscara de potencia de dos más pequeña que cubra el tamaño del alfabeto (p. ej. para un alfabeto de 64 caracteres, la máscara es 63 = 0b00111111)
  2. Genere bytes aleatorios y aplique la máscara: byte & mask
  3. Si el valor enmascarado está dentro del rango del alfabeto, úselo. De lo contrario, descarte e intente de nuevo.

Esto significa que algunos bytes aleatorios son descartados, pero el resultado es una distribución perfectamente uniforme sobre el alfabeto — ningún carácter es más probable que otro.

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"

Soporte de Entorno

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 el polyfill expo-crypto o react-native-get-random-values
Edge / Cloudflare Workers
Entornos edge (Cloudflare Workers, Vercel Edge) — Web Crypto API disponible
React Native
Bun — soporte nativo de crypto

Ejemplos 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 puede usarse directamente en el navegador mediante una importación CDN. No se requiere paso de compilación para prototipado rápido.

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
}

Preguntas Frecuentes

¿Es NanoID criptográficamente seguro?
Sí — al usar la importación predeterminada, NanoID genera IDs usando el CSPRNG a nivel de SO (crypto.getRandomValues en navegadores, crypto.randomFillSync en Node.js). Esta es la misma fuente de entropía usada para la generación de claves criptográficas. Los valores NanoID son adecuados para tokens de sesión, claves API y otros identificadores sensibles a la seguridad.
¿Puedo usar NanoID como clave primaria de base de datos?
Sí. Las cadenas NanoID son seguras para URL y pueden almacenarse como columnas CHAR o VARCHAR. Sin embargo, NanoID no tiene componente de marca de tiempo, por lo que los IDs no son ordenables por orden de generación — esto causará fragmentación del índice B-tree a altas tasas de inserción, similar a UUID v4. Para claves primarias ordenadas por tiempo, use ULID o UUID v7 en su lugar.
¿Cómo se compara NanoID con crypto.randomUUID()?
Ambos usan un CSPRNG y proporcionan fuerte aleatoriedad. crypto.randomUUID() es nativo (sin dependencia), produce cadenas UUID v4 con guiones de 36 caracteres y es universalmente reconocido por bases de datos y APIs. NanoID requiere un paquete npm pero produce cadenas más cortas (21 caracteres por defecto) con un alfabeto personalizable. Para la mayoría de los casos, prefiera crypto.randomUUID() para evitar una dependencia.
¿Qué pasa si uso un NanoID muy corto?
Los IDs cortos (p. ej. 6–8 caracteres) tienen una probabilidad de colisión significativamente mayor. Un NanoID de 6 caracteres del alfabeto predeterminado de 64 caracteres tiene solo ~68 mil millones de valores posibles — adecuado para unos pocos miles de IDs antes de que el riesgo de colisión sea no trivial. Use la tabla de probabilidad de colisión anterior para elegir un tamaño apropiado para su volumen esperado de IDs.
¿Puedo usar NanoID en un navegador sin npm?
Sí. NanoID soporta importaciones ESM desde CDN (p. ej. jsDelivr o esm.sh). Impórtelo como módulo en una etiqueta de script con type="module". Esto es útil para prototipado rápido pero no se recomienda para producción — fije a una versión específica y considere alojar el script usted mismo.
¿Funciona NanoID en todos los entornos?
NanoID funciona en todos los navegadores modernos, Node.js, Deno, Bun, Cloudflare Workers y Vercel Edge Functions. Para React Native, se requiere un polyfill para getRandomValues (react-native-get-random-values). La biblioteca está diseñada para ser agnóstica al entorno y detecta la API de crypto disponible automáticamente.