¿Qué es Base62?
Base62 es una forma de escribir un número usando solo los caracteres que sobreviven a pegarse en cualquier sitio: los diez dígitos, las 26 letras mayúsculas y las 26 letras minúsculas. Sin signos de puntuación, sin espacios, sin carácter de relleno, nada que haya que escapar antes de meterlo en una URL, un nombre de archivo, una cookie o una clave de base de datos. Diez más 26 más 26 es 62, y de ahí viene el nombre.
La versión de 30 segundos: el número 12345 se escribe 3D7, y 1234567890 se escribe 1LY7VK. La vuelta atrás es la misma operación en sentido inverso, y necesita el alfabeto exacto que produjo el código — un alfabeto distinto convierte los mismos seis caracteres en otro número, sin ningún mensaje de error.
Esta página hace dos tareas relacionadas, y la diferencia entre ellas importa más que cualquier otra cosa de la página:
- Modo entero trata la entrada como un número. Un ID decimal como
1234567890 se convierte en 1LY7VK, y los ceros iniciales de la entrada no forman parte del valor, así que no se recuperan. - Modo de bytes trata la entrada como una cadena de bytes. Los bytes se leen como un único entero enorme big-endian y luego se dividen entre 62, que es la misma aritmética aplicada a otra cantidad. Aquí el número de bytes cero iniciales sí se conserva, un byte cero por cada carácter cero.
De dónde sale el 62, y qué cuesta
62 no es una potencia de dos, y ese único hecho condiciona todo lo demás. Las codificaciones habituales se construyen cortando la entrada en grupos de bits fijos: 4 bits se imprimen como un carácter hexadecimal, 6 bits como un carácter Base64, 5 bits como un carácter Base32. Base62 no puede hacer eso, porque ningún número entero de bits encaja en un carácter de 62 valores — 5 bits solo nombran 32 valores, 6 bits nombran 64. Así que Base62 recurre a la aritmética: lee toda la entrada como un entero y lo imprime en base 62.
Un carácter transporta entonces log2(62) = 5,954 bits, muy cerca de los 6 de Base64, y en modo decimal un carácter sustituye a log62(10) = 1,792 dígitos decimales. Algunas consecuencias que conviene conocer antes de elegir una longitud:
| Longitud del código | Valores que puede nombrar | En la práctica |
| 4 caracteres | 624 = 14 776 336 | Suficiente para un contador que se mantenga por debajo de ocho cifras, y cabe en el espacio de un número de teléfono. |
| 6 caracteres | 626 = 56 800 235 584 | La forma habitual de un código de ID. Un ID decimal de diez dígitos cabe en seis caracteres. |
| 7 caracteres | 627 = 3 521 614 606 208 | Supera en dos órdenes de magnitud el rango de un contador de 32 bits, en el ancho de un slug de enlace corto. |
| 11 caracteres | 6211 = 52 036 560 683 837 093 888 | Más que 264 = 18 446 744 073 709 551 616, así que un número completo de 64 bits cabe en once caracteres. |
Vista al revés: 1000 dígitos decimales necesitan unos 558 caracteres, y 4096 dígitos decimales necesitan 2285. El ahorro es real pero acotado: Base62 acorta un número decimal en torno a un 44%, y nunca supera a las codificaciones imprimibles más densas, porque 5,954 bits por carácter es simplemente menos que 6,4 o 6,5.
Modo entero: qué pasa con los ceros iniciales
Un entero tiene una única forma escrita canónica, y empieza por el carácter cero del alfabeto, que es 0 en las dos ordenaciones que empiezan por dígitos y A en la ordenación de letras primero. Todo lo que queda a la izquierda del primer carácter significativo es relleno, y el relleno no forma parte de un valor: 00012345 y 12345 se convierten ambos en 3D7. Si se quiere un ancho fijo — por ejemplo, un código de siete caracteres que tiene que alinearse en una columna — el cuadro Rellenar el resultado a un ancho fijo de la página repite caracteres cero hasta alcanzar el ancho, así que 12345 con ancho 7 se imprime como 00003D7 en el alfabeto de dígitos primero y como AAAADNH en el de letras primero. El relleno es cosmético: esos caracteres iniciales no suman nada al valor, y decodificar cualquiera de las dos cadenas devuelve 12345, porque 0 × 626 y 0 × 625 son ambos cero, sea cual sea el carácter que escriba el cero.
Decodificar una cadena rellenada también funciona, y la página indica cuántos de los caracteres iniciales eran caracteres cero, para que la diferencia entre «el código tiene siete caracteres» y «el valor necesitaba tres caracteres» nunca sea un misterio.
Modo de bytes: la misma aritmética sobre una cadena de bytes
El modo de bytes lee los bytes de la entrada como un único entero big-endian — toda la cadena de bytes se trata como un único número, sea cual sea su longitud — e imprime ese número en base 62. Como un byte contiene 8 bits y un carácter representa 5,954 de ellos, el modo de bytes no es compresión: necesita un 134% del tamaño de la entrada, algo peor que el 133% de Base64. En la muestra de 92 bytes de la tabla de tamaños de arriba, 92 bytes se imprimen como 124 caracteres Base62, y Base64 también imprime 124 (123 de ellos antes de su relleno =). Base62 pierde frente a Base64 en densidad y gana en seguridad de caracteres, que es la compensación que hacen a propósito todos los enlaces cortos y los códigos de invitación.
Los bytes cero iniciales se conservan, y esto es fácil de equivocar en ambos sentidos. Dos bytes cero iniciales seguidos de 0x01 se imprimen como 001 en el alfabeto de dígitos primero y como AAB en el de letras primero, porque los caracteres iniciales representan cero y hay uno por cada byte cero. Una cadena de bytes formada por un solo 0x00 se imprime como el carácter 0, y una cadena de un solo 0x01 se imprime como 1. Es el único punto en el que el modo de bytes y el modo entero se ven distintos ejecutando el mismo algoritmo.
El coste de todo esto es que el modo de bytes hereda el tiempo cuadrático de la aritmética: 1024 bytes se estiman en unos tres décimos de segundo y 2048 bytes en unos 1,3 segundos, las mismas cifras que da la tabla de límites de arriba. Por eso el modo de bytes de esta página está limitado a 2048 bytes de entrada y a 2048 caracteres de vuelta — 2048 bytes se imprimen como unos 2751 caracteres, así que unos 1520 bytes es la carga útil más grande que sobrevive a una ida y vuelta por esta página — y por eso el modo de bytes aquí es una referencia para valores pequeños, no un sustituto de Base64 o Base91 para archivos reales.
Los tres alfabetos, y por qué el alfabeto lo es todo
Los caracteres de un alfabeto son una secuencia fija, y el valor de un carácter es su posición en esa secuencia. Mover la secuencia cambia el significado de cada carácter. Se usan mucho tres ordenaciones, y esto es el mismo número escrito de tres formas en cada una:
| Decimal | 0-9 y luego A-Z y luego a-z | 0-9 y luego a-z y luego A-Z | A-Z y luego a-z y luego 0-9 |
| 0 | 0 | 0 | A |
| 61 | z | Z | 9 |
| 62 | 10 | 10 | BA |
| 12 345 | 3D7 | 3d7 | DNH |
| 1 234 567 890 | 1LY7VK | 1ly7vk | BViHfU |
Lea las tres últimas columnas como un único alfabeto y es un esquema coherente. Léalas como intercambiables y se desmorona, porque la decodificación es ciega al alfabeto de la peor forma posible: cualquier carácter de la entrada está en los tres alfabetos, así que un alfabeto equivocado no produce ningún error, solo un número distinto.
| Un código | Leído como 0-9 A-Z a-z | Leído como 0-9 a-z A-Z | Leído como A-Z a-z 0-9 |
| 3D7 | 12 345 | 13 957 | 211 665 |
| 1LY7VK | 1 234 567 890 | 1 624 950 792 | 48 723 527 772 |
Las mayúsculas son una segunda versión, más aguda, de la misma trampa. Base62 distingue mayúsculas y minúsculas en todas las ordenaciones, así que pasar un código a minúsculas lo reescribe en silencio: 1LY7VK es 1 234 567 890 en el alfabeto de dígitos primero, mientras que 1ly7vk es 1 624 950 792 en ese mismo alfabeto — y resulta ser 1 234 567 890 en el alfabeto de dígitos y luego minúsculas, porque esa ordenación es exactamente la de dígitos primero con las dos variantes de letra intercambiadas. Tampoco se comparte el carácter cero: las dos ordenaciones que empiezan por dígitos escriben el cero como 0, mientras que la de letras primero lo escribe como A, así que ese alfabeto no empieza por un dígito en absoluto.
Base62 junto a las demás codificaciones
| Codificación | Bits por carácter | Tamaño respecto a la entrada | Notas |
| Base16 (hex) | 4 | 200% | Dos caracteres por byte, trivialmente legible, sin alfabeto que consultar. |
| Base32 | 5 | 160% | Sin distinción de mayúsculas y segura para dictar, la más derrochadora del grupo. |
| Base36 (0-9 a-z) | ~5,17 | ~155% | Solo dígitos y letras minúsculas, así que sobrevive a un proceso de conversión a minúsculas. 12345 es 9ix. |
| Base58 | ~5,86 | ~137% | Elegida para direcciones, no por densidad: se eliminan cuatro caracteres parecidos en lugar de ordenarlos. Vea Base32 / Base58. |
| Base62 | ~5,95 | ~134% | Cada carácter es un dígito o una letra, así que nunca hay que escapar nada. La densidad queda entre Base58 y Base64. |
| Base64 | 6 | 133% | El predeterminado en todas partes, a costa de +, / y =, los tres caracteres que obligan a escapar. Vea el convertidor Base64. |
| Ascii85 / Base85 | 6,4 | 125% | 5 caracteres por cada 4 bytes, pero divide entre 85 y su alfabeto necesita comillas. Vea Ascii85. |
| Base91 | ~6,5 | ~123% | La más densa de estas, y la que menos segura es para pegarla sin escapar. Vea Base91. |
Los porcentajes son costes asintóticos redondeados; los recuentos medidos de caracteres de una entrada real de 92 bytes están en la tabla de tamaños más arriba de esta página. En el modo entero la comparación va en sentido contrario, porque la entrada es texto decimal y no bytes: ahí Base62 es unos un 44% más corto que los dígitos que sustituye, y Base36 unos un 36% más corto, por eso un código de ID suele ser Base62 o Base36 y no Base58.
Lo que Base62 no es
- No es un estándar. No hay RFC ni especificación. Ningún organismo de normalización ha definido nunca Base62, por eso el alfabeto no está garantizado y por eso esta página imprime las tres ordenaciones en lugar de elegir una en silencio.
- No es cifrado. Es un cambio de base, nada más. Cualquiera que conozca el alfabeto lo revierte en una sola pasada, y no hay clave, ni sal, ni secreto de ningún tipo.
- No es compresión. El modo de bytes hace crecer los datos cerca de un tercio. El modo entero solo parece compresión porque el texto decimal es una forma ineficiente de escribir un número en primer lugar.
- No distingue entre mayúsculas y minúsculas de forma indiferente. Base32 puede pasarse a minúsculas y leerse de vuelta; Base62 no. Un código que viaja por un sistema que normaliza las mayúsculas está corrompido.
- No se autocomprueba. No hay suma de comprobación ni carácter de verificación, así que un carácter equivocado da un resultado con aspecto válido pero con otro valor. Si eso importa, la ordenación de Bitcoin viene con suma de comprobación — vea la sección de Base58Check de Base32 / Base58.
- No tiene longitud fija. El número de caracteres crece con el valor, así que un contador que empieza en 1 y llega a 627 pasa de un carácter a ocho. Rellene a un ancho fijo cuando necesite una columna estable.
Trampas que de verdad muerden
- El alfabeto es la respuesta a nueve de cada diez misterios. Si otra herramienta da un código distinto para el mismo número, compare los dos alfabetos carácter a carácter antes de sospechar de un error. La tabla de arriba muestra el mismo valor en tres alfabetos, y los tres son correctos.
- Un alfabeto equivocado falla en silencio. No hay ruta de error para ese caso:
3D7 se decodifica como 12 345, 13 957 o 211 665 según cuál sea la ordenación supuesta. Compruebe el primer carácter, que es el más probable que sea un relleno de cero, y compruebe si el alfabeto tiene dígitos o letras al principio. - Los ceros iniciales significan dos cosas distintas. En modo entero
00012345 y 12345 son el mismo número e imprimen igual. En modo de bytes un byte cero inicial es un dato, y se imprime como un carácter cero adicional. Quitar uno de esos caracteres cambia la cadena de bytes. - La normalización a minúsculas destruye un código. Una dirección de correo, un nombre de host o una ruta de Windows pueden pasar a minúsculas en tránsito. Un código Base62 no sobrevive a eso, y esa es la razón de que Base36 siga existiendo.
- Las entradas largas son lentas, no solo grandes. La conversión es aritmética sobre la entrada entera de una vez, así que duplicar la longitud de la entrada multiplica el tiempo por cuatro. Esta página rechaza las entradas que superan sus límites medidos en lugar de colgarse; la tabla de tamaños de arriba da las cifras medidas.
- Una cadena Base62 no demuestra nada. Como casi cualquier cadena de dígitos y letras se decodifica sin quejarse, un slug de URL arbitrario se decodificará en algún número. Un código solo significa algo si el sistema que lo emitió también guarda la correspondencia.
Respuestas rápidas
«¿Por qué otra herramienta Base62 da un código distinto para el mismo número?»
Porque el alfabeto es distinto. Base62 no tiene una especificación con la que discrepar, así que las implementaciones eligen una ordenación: dígitos y mayúsculas primero, dígitos y minúsculas primero, o letras antes que dígitos. Cambie el selector de alfabeto de arriba de esta página para ver las tres respuestas lado a lado.
«¿Es segura Base62 en una URL?»
Sí, en cada una de las tres ordenaciones. Los 62 caracteres son letras y dígitos sin escapar, así que ninguno se expande en un triplete de porcentaje en una consulta, y ninguno termina una URL, un segmento de ruta o un atributo HTML. Esa es la razón completa de que los enlaces cortos usen Base62 y no Base64.
«¿Cuál es más corta, Base62 o Base64?»
Para bytes, Base64 es algo más corta: unos un 133% de la entrada frente a unos un 134%. En la muestra de 92 bytes de arriba ambas empatan en 124 caracteres. Para números decimales, Base62 acorta el texto en torno a un 44%, y ahí está la ganancia práctica.
«¿Puedo decodificar una cadena Base64 con esta página?»
No, y no le avisará de que ha fallado. Los dos alfabetos se solapan en los 62 caracteres, así que una cadena Base64 suele ser una entrada «válida» también aquí y simplemente se decodifica en otro número. Use Base64 para Base64.
«¿Tiene un código Base62 una longitud máxima?»
No, en teoría el algoritmo no tiene cota. En la práctica esta página se detiene en 4096 dígitos decimales, o 2048 bytes, porque la aritmética que hay detrás es cuadrática y la pestaña se congelaría sin nada en pantalla que lo explicara. La tabla de límites de más arriba de esta página enumera las cifras medidas.
«¿Cómo sé que el resultado de esta página es correcto?»
Pulse Autocomprobación. Ejecuta todos los ejemplos documentados, todas las longitudes de bytes de 0 a 64 y una serie de números decimales en los tres alfabetos, comparando los valores devueltos con lo que entró, y vuelve a comprobar que los 62 caracteres de cada alfabeto son seguros en una URL. El botón Ejemplo además compara sus tres resultados con los valores registrados en el archivo de datos de esta página, que se verificaron con una segunda implementación independiente de enteros grandes que se mantiene en las herramientas de prueba de este sitio.
Estándares y créditos
No hay un estándar que implementar aquí: Base62 es una convención, no una especificación, y los tres alfabetos impresos arriba son los que aparecen en el software real. Esta página lo implementa con las rutinas de enteros grandes propias del sitio, escritas en aritmética simple sobre matrices de dígitos, de modo que ningún tamaño queda limitado por el tipo numérico de JavaScript.
El texto de la página se escribió para este sitio. Cada ejemplo resuelto de esta página lo produjo el propio código de la página y después se verificó con una segunda implementación independiente que usa enteros grandes nativos, que se mantiene en las herramientas de prueba de este sitio; la misma implementación verificó las tablas de ejemplos y de tamaños del archivo de datos.