如何编码和解码 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。如果解码出的值看起来是乱码,先试试另一种顺序,再怀疑数据本身。
用于短 ID 和短链接的 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 个字符,而 hex 需要 32 个。
较短的顺序 ID 会暴露记录总数,也很容易被猜到。如果这一点很重要,请编码随机字节而不是计数器。
Base62 如何处理字节和前导零
由于 62 不是 2 的幂,Base62 无法把比特组映射为字符。它把输入读作一个大端序的大数,再把这个数转换为 62 进制。前导零字节会消失,所以本工具为每个前导零字节写一个 0:字节 00 00 编码为 00,00 ff 编码为 047。
在这一点上各个库也不一样。很多库只编码数字并丢掉前导零,固定宽度的格式则会补齐到固定长度。如果接收方期望固定宽度,请在输出左侧补 0。大数方法的开销还会随输入长度的平方增长,所以本工具把 Base62 输入限制在 64 KB。
在 Python 中使用 Base62
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 不是 2 的幂,它必须把数据当作一个大数处理。输出比 Base64 长约 1%。
如何把数字编码为 Base62?
把 从 设为 整数(大数),然后输入十进制数字。使用默认字母表时,1000000 变成 4C92。如果把数字当作文本编码,编码的就是它的数字字符。
Base62 区分大小写吗?
区分。A 和 a 是不同的数字,在默认顺序中分别为 10 和 36。会把 URL 或 ID 转成小写的系统会损坏 Base62 字符串;如果大小写可能丢失,请使用 Base36。