我需要将一个长度为20个字符的base62(0-9a-zA-Z)编码字符串压缩成15-16个字符的字符串,以便挤入其他一些信息。棘手的部分是压缩输出应该也是base62编码。可以这样做吗?任何建议都非常感谢。
谢谢!
答案 0 :(得分:3)
参见Pigeonhole principle - 如果你试图将100只鸽子放入10洞,一些洞将有多只鸽子。同样,对于您的问题,必须出现两个字符串压缩到相同的字符串。在这些情况下,您将不知道将压缩字符串解压缩到哪个字符串。
所以不,你不能losslessly以相同的编码为所有可能的输入压缩20个字符到16个字符(甚至20到19个字符)。
如果输入具有一些定义特征,例如唯一的大写字符将是第一个字符,最后3个字符是数字出现的位置等,那么它将更具可压缩性并且可能是可能的
如果您具有此类特征(或者如果要转换为具有足够空间的其他编码),则可以轻松地将任何编码中的字符串转换为唯一编号,然后将此编号转换为不同编码的字符串。这样做的方法是:
对于每个字符位置,从0开始,为该位置允许的每个可能字符指定一个数字。
因此,如果在第一个位置允许“A”到“Z”和“a”到“z”,你可以通过“Z”分配0-25到“A”,通过“Z”分配到26-51到“a” “Z”。例如,“B”将为1。
迭代字符串,将总数乘以当前位置的允许值数,然后将分配给该位置的字符的数字加到总数中。
要获得不同的编码,只需重复:
如果您在上述任何一种情况下从左到右或从右到左,只要选择一种方式并坚持下去就没关系。
您还可以通过计算每个编码的最大可能值(通过获取每个字符的最大值)来轻松确定是否可以进行此类转换 - 如果目标具有较小的最大可能值,则无法进行转换。
请注意,上述内容仅适用于某些位置具有固定值的情况,尽管您可以在某种程度上将其扩展为适用于其他编码(例如字符串中最多包含1个数字),但这会有所帮助更复杂。
示例:
输入格式: 1个大写字母(A-Z),然后2个数字(0-9)
输出格式: 1个小写字母(a-z),然后是2个大写/小写字母(A-Z或a-z)
输入:“Z35”
数量: 10 *(10 *(26 * 0 + 25)+ 3)+ 5 = 2535
说明:我们以“Z”开头,总数为0开始,我们乘以大写字母数(26)然后加上“Z”(25)的值。然后我们转到“3”,我们将这个总数乘以数字(10)并添加“3”(3)的值,依此类推。
输出计算:
2535/26 = 97
2535%26 = 13,所以第一个字符=“n”(13 + 1 =第14个字母)
97/52 = 1
97%52 = 45,所以第2个字符=“t”(45-26 + 1 =字母表的第20个字母)
1%52 = 1,所以第3个字符=“B”
输出“ntB”输入格式的最大可能值: 10 *(10 *(26 * 0 + 25)+ 9)+ 9 = 2599
输出格式的最大可能值: 52 *(52 *(26 * 0 + 25)+ 51)+ 51 = 70303
可以转换吗?是的,因为70303> = 2599。