¿Qué es un Nano ID?
Nano ID es un generador de identificadores únicos pensado para ser chico, seguro y amigable con las URLs. Por defecto produce cadenas de 21 caracteres tomados de un alfabeto de 64 símbolos: las 26 letras mayúsculas, las 26 minúsculas, los 10 dígitos, más el guion bajo _ y el guion medio -. Todos esos caracteres se pueden usar en una URL sin escaparlos, por eso Nano ID es tan cómodo para links, slugs y tokens públicos. La biblioteca original es de Andrey Sitnik y hoy es una de las alternativas a UUID más usadas en el ecosistema JavaScript.
Por qué es más corto que un UUID
La clave está en el tamaño del alfabeto. Un UUID usa solo caracteres hexadecimales (16 símbolos), así que cada carácter aporta 4 bits de información. Nano ID, con 64 símbolos, aporta 6 bits por carácter. Eso significa que en menos caracteres cabe la misma cantidad de entropía. Un UUID v4 ocupa 36 caracteres (32 hex + 4 guiones) y aporta 122 bits de aleatoriedad; un Nano ID de 21 caracteres aporta unos 126 bits en 21 caracteres. Más seguridad, menos espacio.
Cómo evita el sesgo de módulo (muestreo por rechazo)
Un generador ingenuo tomaría un byte al azar (0 a 255) y le haría módulo con el tamaño del alfabeto. El problema: si el alfabeto no divide a 256 de forma exacta, algunos caracteres salen más seguido que otros. Ese es el sesgo de módulo, y arruina la uniformidad. El algoritmo de nanoid lo resuelve con muestreo por rechazo: calcula una máscara de bits (la potencia de dos menos uno más chica que cubre el alfabeto), aplica esa máscara a cada byte y descarta los valores que caen fuera de rango. Así, cada carácter del alfabeto tiene exactamente la misma probabilidad. Esta herramienta implementa ese mismo método usando crypto.getRandomValues, nunca Math.random.
Probabilidad de colisión
Con el alfabeto por defecto y 21 caracteres, el espacio de posibles IDs es enorme: 6421, que es del orden de 1037. Aplicando la paradoja del cumpleaños, para tener un 1% de chance de una sola colisión habría que generar unos mil millones de IDs por hora durante más de cien años. Si acortás la longitud o usás un alfabeto más chico (por ejemplo, solo números), el espacio se achica y la chance de colisión sube. La regla es simple: más longitud y más alfabeto, más seguro.
Usos comunes y cuándo elegir UUID
- Slugs y URLs cortas: IDs que se ven bien en un link sin caracteres raros.
- Tokens públicos: identificadores de sesión, invitaciones o enlaces para compartir.
- Claves de recursos: nombres de archivos, keys de caché o IDs de objetos en APIs.
- Bases de datos: como PK cuando no necesitás el formato estándar y preferís ahorrar espacio.
Si necesitás compatibilidad con el formato RFC 4122 (por ejemplo, una columna uuid nativa en PostgreSQL o un sistema que ya espera UUIDs), usá el generador de UUID de Genfy. Para todo lo demás, Nano ID suele ser la opción más compacta.
Tabla: Nano ID vs UUID
| Característica | Nano ID (default) | UUID v4 |
|---|---|---|
| Longitud | 21 caracteres | 36 caracteres |
| Alfabeto | 64 símbolos (A-Za-z0-9_-) | 16 símbolos (0-9a-f) + guiones |
| Bits de entropía | ≈ 126 | 122 |
| URL-friendly | Sí, sin escapar | Sí, pero más largo |
| Formato estándar | No (convención) | Sí (RFC 4122) |
| Colisión (50%) | ≈ 1018 IDs | ≈ 2,7 × 1018 IDs |