Как кодировать и декодировать Base62
- Введите или вставьте текст в поле Ввод · Текст. Строка Base62 появится в поле Результат · Base62.
- Под результатом выберите Алфавит, который использует ваша система: 0-9 A-Z a-z или 0-9 a-z A-Z.
- Для числового ID поменяйте меню Из на Целое (большое число) и введите число в десятичной записи. Для сырых байтов выберите Hex или Base64.
- Чтобы декодировать, нажмите Base62 → Текст в переключателе направления. Опция Алфавит тогда переедет под поле ввода, и алфавит должен совпадать с тем, которым кодировали.
Два порядка алфавита дают разные результаты
Для Base62 нет RFC, и на практике 62 символа упорядочивают двумя способами. Конвертер поддерживает оба:
| Алфавит | Значение A | Значение a | Hello | 1000000 как число |
|---|---|---|---|---|
0-9 A-Z a-z | 10 | 36 | 5TP3P3v | 4C92 |
0-9 a-z A-Z | 36 | 10 | 5tp3p3V | 4c92 |
Первый порядок следует порядку ASCII, поэтому закодированные строки одинаковой длины сортируются так же, как числа. Его использует GMP для оснований от 37 до 62. Второй порядок получается, если продолжить строчные a-f из шестнадцатеричной записи; некоторые библиотеки называют его «инвертированным» алфавитом.
В двух результатах регистр каждой буквы инвертирован. Поэтому ошибку легко не заметить: декодирование 5tp3p3V с неверным порядком проходит успешно, но даёт байты 4e 08 14 29 1d вместо Hello. Если декодированное значение похоже на мусор, попробуйте другой порядок, прежде чем подозревать данные.
Base62 для коротких ID и ссылок
Сокращатели ссылок и схемы идентификаторов используют Base62, потому что каждый его символ безопасен в пути URL, в имени файла и при выделении двойным щелчком, а результат получается коротким. ID в базе данных хранится как число, поэтому кодируйте его из Целое (большое число):
| Десятичное | Base62 (0-9A-Za-z) |
|---|---|
125 | 21 |
3843 | zz |
3844 | 100 |
1000000 | 4C92 |
123456789 | 8M0kX |
Семь символов покрывают числа до 62^7 − 1, это примерно 3,5 триллиона. Для случайного ID кодируйте случайные байты: 16-байтный UUID превращается в 21 или 22 символа против 32 в hex.
Короткие последовательные ID выдают, сколько записей существует, и их легко угадать. Если это важно, кодируйте случайные байты, а не счётчик.
Как Base62 обращается с байтами и ведущими нулями
Поскольку 62 – не степень двойки, Base62 не может сопоставлять символам группы бит. Он читает ввод как одно большое число в порядке big-endian и переводит его в систему по основанию 62. Ведущие нулевые байты при этом исчезли бы, поэтому инструмент записывает за каждый из них цифру 0: байты 00 00 кодируются в 00, а 00 ff – в 047.
Библиотеки и здесь расходятся. Многие кодируют только число и отбрасывают ведущие нули, а форматы фиксированной ширины вместо этого дополняют результат до заданной длины. Если принимающая сторона ждёт фиксированную ширину, дополните результат слева нулями 0. Кроме того, время перевода через большое число растёт с квадратом длины ввода, поэтому инструмент ограничивает ввод для Base62 64 КБ.
Base62 в Python
В стандартной библиотеке Python нет Base62. Для целочисленных ID конвертация занимает несколько строк:
ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
def b62encode(n: int) -> str:
if n == 0:
return ALPHABET[0]
out = ""
while n:
n, r = divmod(n, 62)
out = ALPHABET[r] + out
return out
def b62decode(s: str) -> int:
n = 0
for ch in s:
n = n * 62 + ALPHABET.index(ch)
return n
b62encode(1000000) # '4C92'
b62decode("8M0kX") # 123456789
Для другого порядка поменяйте местами два блока букв в ALPHABET. Байты сначала переведите в число через int.from_bytes(data, "big"). Как работать с байтами, показано на странице Python.
Вопросы и ответы
Какой алфавит у Base62?
Десять цифр плюс 26 заглавных и 26 строчных латинских букв: 62 символа, и больше ничего. Цифры всегда идут первыми, а дальше одни библиотеки ставят заглавные (0-9A-Za-z), другие строчные (0-9a-zA-Z).
Чем Base62 отличается от Base64?
Base64 добавляет + и / (или - и _) и дополнение = и работает с фиксированными группами по 6 бит. Base62 использует только буквы и цифры, поэтому его нигде не нужно экранировать, но 62 – не степень двойки, и данные приходится обрабатывать как одно большое число. Результат примерно на 1% длиннее, чем у Base64.
Как закодировать число в Base62?
Выберите в меню Из вариант Целое (большое число) и введите десятичное число. С алфавитом по умолчанию 1000000 превращается в 4C92. Если закодировать число как текст, закодируются символы его цифр.
Важен ли регистр в Base62?
Да. A и a обозначают разные цифры: в порядке по умолчанию 10 и 36. Система, которая приводит URL или идентификаторы к нижнему регистру, испортит строки Base62; если регистр может потеряться, используйте Base36.