将字母数字字符串表示为尽可能短的数字字符串


Representing alphanumeric string as a shortest possible numeric string

我正在寻找一种方法,将字母数字字符串(例如"aBD3f")转换为纯数字表示,并获得尽可能短的输入字符串。输入字符串中的有效字符为a-z、a-z、0-9,生成的字符串将仅由数字0-9组成。

由于输入字符串中的每个字符都有62个有效值,因此我可以为每个输入字符分配值00-61,并将6个输入字符转换为12个字符的数字字符串。

但如果可能的话,我想买一些更紧凑的东西,比如8-10位数。有可能吗?如果有,在PHP中有什么算法或函数可以做到这一点吗?

请注意,这必须是一个双向功能。我还需要能够从数字字符串返回到字母数字。

我还没有在这个网站上找到这个问题。我的问题与这个问题正好相反,因为我正试图朝着相反的方向前进。

一个十进制数字平均编码log2(10)=3.32位信息。字母数字数据有62个可能的"数字",因此每个数字平均编码log2(62)=5.95位信息。

这意味着,从字母数字转换为十进制数字只需要输出中的字符数大约是输入中的5.95/3.32=1.79倍。如果您的输出最多限制为10个字符,您可以期望它最多编码5.58个字母数字输入字符,这在实际应用中意味着只有5个字符。这里没有机动的余地;这是一个冷冰冰的数学。

从一种表示转换为另一种表示的方式相当简单,因为从本质上讲,你只是将一个数字从62基数转换为10基数,然后再转换回来。你可以根据我的答案稍微调整一下代码来达到目的。

在实际操作中查看

注意,对于(任意)数字顺序,我选择了5个字符的"最大"可能输入是"ZZZZZ",它编码为9个十进制数字。如果你将输入扩展到6个字符,最大的输入将是"ZZZZZZ",它需要11个十进制数字来编码——正如预测的那样,超过了我们施加的限制。

还要注意,该分析假设每个可能的输入字符串都和其他字符串一样可能发生,即输入是完全随机的。如果不是这种情况,那么输入的实际信息内容将低于理论最大值,因此您可以通过某种压缩方案来利用这一点。