将大数字(或字符串)压缩为小数值
我的ASP.NET页面具有以下查询字符串参数:
…?IDs=1000000012,1000000021,1000000013,1000000022&...
IDs
在这种情况下,此处的参数将始终由数字分隔,
。目前有4个数字,但通常在3
和之间7
。
现在,我正在寻找一种方法将上面的每个大数字转换为最小的可能值;具体压缩IDs
查询字符串参数的值。欢迎压缩每个数字算法或压缩IDs
查询字符串参数的整个值。
- 编码或解码不是问题;只是压缩值
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的:-)
以上是 将大数字(或字符串)压缩为小数值 的全部内容, 来源链接: utcz.com/qa/430514.html