我正在寻找一种转换字母数字字符串的方法,例如“aBcd3f”,转换为纯数字表示,并获得最短的输入字符串。输入字符串中的有效字符为a-z,A-Z,0-9,结果字符串仅包含数字0-9。
由于输入字符串中每个字符有62个有效值,因此我可以为每个输入字符分配值00-61,并将6个输入字符转换为12个字符的数字字符串。
但是如果可能的话,我想得到更紧凑的东西 - 例如8-10位数。是否有可能,如果有的话,是否有任何算法或函数可以在PHP中执行此操作?
请注意,这必须是双向功能。我还需要能够从数字字符串返回到字母数字。
我在这个网站上没有发现这个问题。我的问题与this question相反,因为我正试图向相反的方向发展。
答案 0 :(得分:2)
十进制数字平均编码log2(10)= 3.32位信息。字母数字数据有62个可能的“数字”,因此每个数字平均编码log2(62)= 5.95位信息。
这意味着仅从字母数字转换为十进制数字将需要输出中大约5.95 / 3.32 = 1.79倍的字符比输入中的字符多。如果您的输出被限制为最多10个字符,您可以期望它最多编码5.58个字母数字输入字符,实际上这意味着只有5个字符。这里没有操作空间;这是冷数学。
从一种表示转换为另一种表示的方式相当简单,因为从本质上讲,您只是将数字从基数62转换为基数10并返回。您可以稍微调整我的this answer代码来实现目标。
请注意,对于(任意)数字顺序,我选择了具有5个字符的“最大”可能输入是“ZZZZZ”,其编码为9个十进制数字。如果将输入扩展为6个字符,则最大输入将是“ZZZZZZ”,这将需要11个十进制数字进行编码 - 超过我们施加的限制,如预测的那样。
另请注意,此分析假设每个可能的输入字符串都可能与其他输入字符串一样发生,即输入完全是随机的。如果不是这种情况,那么输入的实际信息内容将低于理论最大值,因此您可以利用某种压缩方案来利用它。