UUID vs NanoID
Ambos generan identificadores que se mantienen únicos sin una autoridad central. Los UUID son el estándar: 36 caracteres, RFC 9562, integrados de serie en cada runtime y base de datos. Los NanoID son la alternativa compacta: 21 caracteres seguros en URL con una entropía comparable. Predeterminado: UUID para claves e infraestructura; NanoID cuando el ID aparece en URL.
UUID vs NanoID: explicación
Todo sistema distribuido necesita identificadores que dos máquinas puedan crear en el mismo instante sin consultarse entre sí. Los UUID lo resolvieron en los años 80, estandarizados como RFC 4122 y revisados en 2024 como RFC 9562; NanoID llegó en 2017 como una biblioteca minimalista en pos de cadenas más cortas. Ambos son a prueba de colisiones por la misma matemática —bastantes bits aleatorios— y ninguno necesita un servidor de coordinación.
Un UUID son 128 bits representados como 36 caracteres: 32 dígitos hexadecimales en el patrón 8-4-4-4-12, seis de ellos dedicados a marcadores de versión y variante, así que la versión 4 lleva 122 bits aleatorios. Un NanoID predeterminado son 21 caracteres tomados de A-Za-z0-9_- —64 símbolos de 6 bits cada uno, 126 bits aleatorios—, mediante crypto.getRandomValues. Formas distintas, misma meseta de colisiones.
Las diferencias reales son operativas: quién puede producir y validar cada forma, cómo se comportan los ID dentro de los índices de la base de datos, cómo se ven en una URL y lo reversible que es la elección. Todo se mide abajo, con un generador local enlazado a lo largo de la página para comparar salida real.
¿Quieres ver ambas formas en salida real? El Generador de UUID se ejecuta por completo en tu navegador — crypto.getRandomValues, sin llamadas de red, sin registrar nada.
Para el recorrido completo de lo que codifica cada versión, la Guía de las versiones de UUID repasa de la v1 a la v8 con ejemplos resueltos.
Anatomía: qué hay dentro de cada ID
Los UUID codifican sus propios metadatos. Los bits 48–51 guardan la versión —1 para tiempo más MAC, 4 para aleatorio, 7 para aleatorio ordenado por tiempo— y dos bits más fijan la variante. Una v4 siempre parece aleatoria; una v7 empieza con una marca de tiempo legible, porque sus primeros 48 bits son milisegundos desde el epoch de Unix y los UUID acuñados el mismo día comparten prefijo.
Los NanoID no llevan metadatos. Cada carácter es un sorteo independiente del alfabeto, elegido con enmascaramiento y muestreo por rechazo sobre crypto.getRandomValues, de modo que cada símbolo mantiene la misma probabilidad. Esa pureza es la razón por la que el formato es flexible —cambia el alfabeto o la longitud, conserva el algoritmo— y por la que un NanoID no revela nada sobre cuándo se creó.
| Aspecto | UUID | NanoID |
|---|---|---|
| Especificación que lo rige | RFC 9562 (2024, antes RFC 4122) | Convención de biblioteca (nanoid) — sin RFC |
| Tamaño predeterminado | 36 caracteres, 128 bits | 21 caracteres, 126 bits |
| Alfabeto | 0-9a-f más 4 guiones | A-Za-z0-9_- (64 símbolos) |
| Fuente de aleatoriedad | CSPRNG; crypto.randomUUID() | crypto.getRandomValues con enmascaramiento |
| Marca de tiempo incrustada | v1 y v7 sí; v4 ninguna | Ninguna — opaco por diseño |
| Entropía útil | 122 bits (v4); 74 bits aleatorios en v7 | 126 bits a 21 caracteres |
La matemática de las colisiones: por qué ninguno colisiona nunca
La cota del cumpleaños dice que un identificador aleatorio de n bits alcanza una probabilidad de colisión del 50 por ciento cerca de 2^(n/2) sorteos. Para UUID v4 eso ronda 2^61 —unos 2,3 quintillones de IDs— antes de que las probabilidades de un solo duplicado lleguen a la mitad; los 126 bits de NanoID empujan la barra un poco más allá. En la práctica, ambos son sistemas de «esto no pasa nunca»: cualquier duplicado que te encuentres es un bug de código, no un evento de entropía.
Esa equivalencia es la razón por la que el debate del tamaño importa menos de lo que se asume: 21 caracteres de NanoID no son más seguros que un UUID v4 —la misma garantía en menos bytes—. Las razones honestas para elegir son el encaje operativo —almacenamiento, URL, herramientas—, no el riesgo de colisión.
Bases de datos: el problema de la localidad en el índice
Inserta una clave aleatoria en un índice B-tree y la fila puede caer en cualquier página; llena páginas a medias en orden aleatorio y cada inserción arriesga una división de página, escrituras extra y una caché más fría. Ese es el impuesto de fragmentación que pagan tanto UUID v4 como NanoID —NanoID incluido, porque es igual de aleatorio—. En una clave primaria indexada con carga intensa de escritura, por defecto ninguno es amable con el índice.
UUID v7 es la corrección que viene de serie dentro del estándar: sus primeros 48 bits son una marca de tiempo en milisegundos, así que las claves nuevas casi siempre se ordenan hacia el borde derecho del índice. NanoID no puede ofrecer esto: sin componente temporal, nada por lo que ordenar. En una columna indexada, la elección real es la v7 contra todo lo demás.
- v4 y NanoID dispersan las inserciones por el árbol —divisiones de página y fallos de caché a escala—.
- El tipo uuid de Postgres almacena 16 bytes en bruto; una clave de texto de 36 caracteres almacena 37 o más.
- La ventaja textual de NanoID —21 caracteres contra 36— solo se sostiene mientras el alfabeto permanezca documentado.
URL, alfabetos y el dial de longitud
El alfabeto de NanoID es seguro para URL por construcción: A-Za-z0-9_- no necesita codificación porcentual en ningún punto de una URL, así que un ID puede ser un segmento de ruta, un valor de consulta o un slug sin escapar nada. Los UUID también son técnicamente seguros para URL —los dígitos hexadecimales y los guiones nunca necesitan codificación—, pero 36 caracteres son mucha cadena visible para un enlace.
El alfabeto personalizado es la característica más práctica de NanoID: códigos solo numéricos, enlaces cortos en minúsculas —cambia los 64 símbolos, conserva el algoritmo—. Respeta la regla de que la entropía es la longitud por el log2 del tamaño del alfabeto: un NanoID en minúsculas de 8 caracteres ronda los 38 bits, razonable para un código de una hora, temerario como clave primaria. Los UUID no ofrecen ese dial; el formato está fijado en 128 bits.
Cuándo elegir cada uno
Elige UUID cuando el ID vive en la infraestructura: claves primarias de base de datos (v7), intercambio entre equipos y proveedores, cualquier cosa que un tercero deba validar, cualquier sitio donde lo integrado le gane a una dependencia. El estándar es el producto: todos los lenguajes, ORM y bases de datos ya lo hablan.
Elige NanoID cuando el ID es visible para el usuario: URL cortas, enlaces de invitación, nombres de archivo, valores de cookie, IDs de petición en los logs. La recomendación se invierte con la misma claridad: si sigues peleándote con lo ancho de un UUID dentro de una URL, ese enlace quiere NanoID; si te descubres reimplementando NanoID en un backend cuya base de datos podría servir claves de forma nativa, esa columna quiere un UUID v7.
Preguntas frecuentes
¿Puedo generar UUID o NanoID aquí sin que nada se envíe a un servidor?
Sí. El generador funciona en tu pestaña usando el crypto.getRandomValues del propio navegador, y ninguna petición sale de la página — la Content-Security-Policy del sitio bloquea las llamadas salientes. Abre el panel Network de DevTools mientras generas y comprueba cómo se queda en silencio. La aleatoriedad viene de tu sistema operativo a través del navegador, así que la calidad iguala a la generación del lado del servidor.
¿Los NanoID son tan seguros contra colisiones como un UUID v4?
Algo más, contando bits en bruto: 126 frente a los 122 de la v4. El punto de colisión del 50 por ciento queda un poco más allá de 2^61 sorteos (unos 2,3 quintillones de IDs para la v4), lejos de cualquier volumen realista. La brecha solo se vuelve pensable cuando acortas la longitud o el alfabeto de NanoID.
¿Debería usar NanoID como clave primaria de una base de datos?
Puedes, pero una clave de texto de 21 caracteres es igual de aleatoria que la v4, así que hereda la misma fragmentación de B-tree en tablas con mucha escritura. Si las inserciones son calientes, UUID v7 —ordenado por tiempo— es la elección amable con el índice. NanoID compra cadenas más cortas, no localidad en el índice.
¿NanoID es un estándar como UUID?
No. UUID es RFC 9562, con soporte nativo en todos los lenguajes, el tipo uuid de Postgres y crypto.randomUUID(). NanoID es una convención de biblioteca: lo bastante pequeño para reimplementarlo en minutos, pero cada productor y consumidor debe ponerse de acuerdo en alfabeto y longitud, y nada valida la conformidad. Ese acuerdo es el precio de los 15 caracteres ahorrados.
¿Por qué se recomienda UUID v7 sobre la v1?
El campo node de la v1 lleva la dirección MAC de la máquina, lo que filtra la identidad del hardware y vincula ID entre sistemas, y su marca de tiempo gregoriana de 100 nanosegundos se ordena de forma torpe junto a las herramientas de tiempo Unix. La v7 reemplaza ambas cosas con 48 bits de milisegundos Unix más bits aleatorios: ordenable por tiempo, neutral en privacidad, mismo RFC. Empieza los diseños nuevos en v7 o v4.
¿Cuánto puede acortarse un NanoID antes de que importen las colisiones?
La entropía es el número de caracteres por el log2 del tamaño del alfabeto; divide el exponente entre dos para la cota del cumpleaños. Los 21 caracteres predeterminados son 126 bits. Doce caracteres son 72 bits, cerca de 2^36 sorteos hasta el cincuenta por ciento —aceptable por usuario, flojo para una tabla global—. Ocho son unos 48 bits: códigos de vida corta, nunca claves primarias.
¿Dónde puedo leer las normas citadas aquí?
¿Qué herramientas relacionadas debería usar después?
- Generar UUIDGenera UUID v4, v7 y v1 en lote e inspecciona los existentesAbrir
- Versiones de UUIDGuía en lenguaje sencilloAbrir
- GeneradoresIdentificadores, texto de relleno y códigos.Abrir
- Cómo funciona Base64Guía en lenguaje sencilloAbrir
- JWT vs tokens de sesiónComparativa directaAbrir
- Formatear JSONIndenta, ordena claves y quita comentariosAbrir