一尘不染

将大数字(或字符串)压缩为小数值

algorithm

我的ASP.NET页面具有以下查询字符串参数:

…?IDs=1000000012,1000000021,1000000013,1000000022&...

IDs在这种情况下,此处的参数将始终由数字分隔,。目前有4个数字,但通常在3和之间7

现在,我正在寻找一种方法将上面的每个大数字转换为最小的可能值;具体压缩IDs查询字符串参数的值。欢迎压缩每个数字算法或压缩IDs查询字符串参数的整个值。

  1. 编码或解码不是问题;只是压缩值IDs查询字符串参数。
  2. 为创建一些唯一的小值IDs,然后从某个数据源中检索其值超出了范围。

是否有一种算法可以将如此大的数字压缩为较小的值,或者将IDs查询字符串参数的值全部压缩在一起?


阅读 962

收藏
2020-07-28

共1个答案

一尘不染

基本上,您的数字需要很大的空间,因为您使用的是基数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的:-)

2020-07-28