为什么最流行的编码算法是刚好带两个符号破坏兼容性的 base64,而不是能够无视大小写的 base36、不带符号的 base62?这两个符号不仅严重影响兼容性使标准码表的 base64 不能直接拼在 url 中,还没有增加多少信息密度

111 天前
 drymonfidelia

base64 的编码结果并不是二进制,码表长度是 2 的整数次方没有任何的加成。

被 base64 坑了好几次,按=截断 key=value 数据的时候忘记指定 maxsplit=1 导致=后面的数据丢掉。

5910 次点击
所在节点    程序员
49 条回复
MoYi123
111 天前
不是有 base64url 吗?
drymonfidelia
111 天前
@MoYi123 我说了 **标准码表** 啊,我是想讨论兼容性这么差的编码算法为什么会流行起来
MoYi123
111 天前
@drymonfidelia 因为 n % 64 == n & (63), 而 base62 和 base36 不行, 就这么简单.
vvhy
111 天前
字符串分割可不是处理 url 的好方法
Trim21
111 天前
码表长度是 2 的整数次方当然有加成啊,这意味着不需要进行大整数运算。
masterclock
111 天前
base64 发明的时候 http 还没被发明出来
bczhc
111 天前
因为 base64 广泛啊,multipart 里就能用它。而且 64 是 2 整数次方能方便编解码,重新对二进制位分隔就好了。而且其他的 binary-to-text 编码也有,base58 ,base62 base85 base91 等。你说 base32 ,咋不直接用 base16 ,就直接是十六进制咯。最后,base64url 也是事实上的规范。
drymonfidelia
111 天前
@Trim21 多用几位一起编码不会带来明显的性能损失吧,和兼容性比起来两个符号的问题显得更大
tool2dx
111 天前
base62 解码写起来很麻烦的,代码量要比 base64 多。你写过一次,就知道为什么没有流行起来了。

总最简原则来讲,base64 还是方便不少。
sagaxu
111 天前
base64: 3 字节的东西编码进 4 字节
hex(base16): 2 字节的东西编码进 4 字节
bit 数是固定的,编码解码位运算很方便

base36 ?你告诉我是几字节到几字节?
占几个 bit 固定不固定?如果不固定,可变长时怎么标记位数?如果固定,那 base 一定是 2 的某个次方,比如 16/32/64/128
ipwx
111 天前
@drymonfidelia 本来位运算就比除法快一个数量级。

更何况为了速度,base64 都上 SSE/AVX2/AVX512 向量指令集了。

在编码方面,速度就是这么重要。
ipwx
111 天前
另外看楼主的背景是前端或者后端。

如果楼主会写 C ,大概才能理解为啥 64 位一定比 62 位快很多了。
Trim21
111 天前
@drymonfidelia #8 你首先要理解 baseXX 的意义,是把原始数据作为一个大整数然后进行进制转换。

base62 ,base63 跟 base65 可能差不多,但是 base64 有独特的性质。64=2^6 ,byte 的 255=2^8 意味着每 3 字节的原始数据一定能编码为 4 字节的 base64 。

所以 base64 可以每 4byte 进行处理,用现成的 uint32 就行。换成 base62 你就要处理一个不定长的 big int ,因为 62 不是 2 的幂,没有 base64 这样的性质。
proxytoworld
111 天前
挺奇怪的,又不是没有 url 编码,啥东西 url 编码之后拼在 url 也不会有问题啊,而且 base64 一开始设计也不是给 http 用的,只是刚好能用在 http 上
proxytoworld
111 天前
没看懂影响兼容性,url 编码解码不费 cpu ,又不是 api 改参数了。
h0099
111 天前
IvanLi127
111 天前
这样说的话,主流 base64 不适合你这个用例,没必要上,谁逼你上的直接干他。坑你的人是主张在 url 里放乱七八糟东西的人,而不是 base64 。
Y25tIGxpdmlk
111 天前
base64 我记得好像是 3 位一组 3 位一组,然后不够的用=号补齐。用 62 的话,相似的设计,需要单独一个字符专门用来当补齐符号用。
wy315700
111 天前
因为 3 * 8 = 4 * 6

而 2 ^ 6 = 64 所以挑了 64 个字符
knva
111 天前
挺怪的.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1069022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX