我的ASP.NET页面具有以下查询字符串参数:
…?IDs=1000000012,1000000021,1000000013,1000000022&...
IDs在这种情况下,此处的参数将始终由数字分隔,。目前有4个数字,但通常在3和之间7。
IDs
,
3
7
现在,我正在寻找一种方法将上面的每个大数字转换为最小的可能值;具体压缩IDs查询字符串参数的值。欢迎压缩每个数字算法或压缩IDs查询字符串参数的整个值。
是否有一种算法可以将如此大的数字压缩为较小的值,或者将IDs查询字符串参数的值全部压缩在一起?
基本上,您的数字需要很大的空间,因为您使用的是基数10。一种改进是使用基数16(十六进制)。因此,例如,您可以将255(3位数字)表示为ff(2位数字)。
您可以通过使用更大的数字底数来进一步推广该概念…有效查询字符串参数的所有字符集:
AZ,az,0-9,’。’,’-‘,’〜’,’_’,’+’
这使您可以使用67个字符作为基础(请参阅WikiStringia上的QueryString)。
编辑:
在链接的SO帖子中,查看以下部分:
string xx = IntToString(42, new char[] { '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'});
那几乎就是您所需要的。只需添加缺少的几个字符来展开它:
yz.-〜_ +
那篇文章缺少一种可以追溯到基础10的方法。我不会写它:-),但是过程是这样的:
定义一个计数器,我将其称为TOTAL。
查看最 右边的 字符并找到它在数组中的位置。 TOTAL =(字符在数组中的位置)示例:输入为BA1。现在TOTAL为1(因为“ 1”在数组中的位置1)
现在查看第一个字符左侧的下一个字符,并找到它在数组中的位置。TOTAL + = 47 *(字符在数组中的位置)示例:输入为BA1。现在总计(47 * 11)+1 = 518
现在查看上一个字符的下一个字符,并找到它在数组中的位置。TOTAL + = 47 * 47 (字符在数组中的位置)示例:输入为BA1。现在总计(47 47 * 10)+(47 * 11)+1 = 243508
等等。
建议您编写一个单元测试,将一堆以10为底的数字转换为以47为底的数字,然后再次返回以确保转换代码正常工作。
请注意,您是如何只用基数47的3位数字来表示6位基数10的:-)