我有一个十六进制的128位数字存储在一个字符串中(来自md5,这里不担心安全性),我想将其转换为base-36字符串.如果它是一个64位或更少的数字我将它转换为64位整数然后使用我发现的算法将整数转换为base-36字符串,但这个数字太大了所以我有点喜欢如何处理这个问题的损失.任何指导将不胜感激.
编辑:在Roland Illig指出通过电话说0/O和1/l并且没有获得超过十六进制的数据密度的麻烦之后我想我可能最终会留下十六进制.如果有一种相对简单的方法将任意长度的十六进制字符串转换为base-36字符串,我仍然很好奇.
base-36编码需要6位来存储每个令牌.与base-64相同但不使用28个可用令牌.求解36 ^ n> = 2 ^ 128得到n> = log(2 ^ 128)/ log(36)或25个令牌以对该值进行编码.
base-64编码也需要6位,所有可能的令牌值都使用.求解64 ^ n> = 2 ^ 128得到n> = log(2 ^ 128)/ log(64)或22个令牌以对该值进行编码.
计算base-36编码需要除以36的幂.没有简单的快捷方式,你需要一个可以使用128位值的除法算法.base-64编码更容易计算,因为它是2的幂.只需要一次取6位并移位6,总共22次以消耗所有128位.
你为什么要使用base-36?Base-64编码器是标准配置.如果你真的对令牌空间有一个约束(你不应该,ASCII rulez),那么至少使用base-32编码.或者2的任何幂,base-16是hex.