Base62 通常使用数字、大小写字母,因此适合没有标点的紧凑标识符。Base64 使用 64 个符号,按位分组。虽然名字相近,很多 Base62 实现会把输入作为整数处理,互操作问题也因此不同。
字母表顺序属于格式的一部分
不同库可能先放大写字母,也可能先放小写字母。同一个字符串就会代表不同数值。例如 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 与小写在前的字母表并不兼容。协议必须记录顺序和测试向量,仅写“Base62”不够。
大小写同样重要。代理自动转小写、数据库不区分大小写的排序规则,或人工规范化,都可能改变值。存储层忽略大小写时,普通 Base62 和 Base64 都需要额外设计。
字节编码需要保留长度
文件 01 和 0001 作为无符号整数都等于一,单纯整数转换会丢失差异。面向字节的 Base62 必须定义前导零处理或长度字段,随机令牌和固定长度密码学数据尤其需要注意。
const a = BigInt('0x01');
const b = BigInt('0x0001');
console.log(a === b); // true:整数相等不代表字节相同
根据数据含义选择
同一应用内部缩短数据库整数时,可以使用约定明确的 Base62。独立系统间传输任意字节时,Base64URL 通常有更清楚的标准契约。它用连字符和下划线替换标准版标点,仍保持六位分组。
编码不会增加随机性。连续整数编码后仍可预测。如果标识符需要难以猜测,应先使用密码学随机源产生足够熵,再无损编码。字符串看起来复杂,不代表生成过程安全。
比较长度时,应计入前缀、填充和长度元数据。往返测试至少覆盖空输入、零字节、多个前导零和高位字节。Base64URL 标准见 RFC 4648,Base62 则需要应用自行补全约定。