【问题标题】:Assigning a distinct number to a string为字符串分配一个不同的数字
【发布时间】:2016-08-16 08:04:52
【问题描述】:

假设我有一个像这样的VINSB164ABN10E082986

现在,我想为每个可能的 VIN 分配一个整数(没有 WMI,即前三位数字 -> 64ABN10E082986),之后我会从这个整数中检索 VIN。

这样做的最佳方式是什么?可以利用这种算法的优势,前 10 位数字可以由这些值组成:

1234567890 ABCDEFGH JKLMN P RSTUVWXYZ

最后 4 位可以由所有一位数字组成 (0-9)。

背景:我希望能够节省内存。所以,从某种意义上说,我正在寻找一种特殊的压缩方式。我计算出在这些条件下一个 8 字节整数就足够了。我只是缺少做“映射”的方式。

它应该是这样工作的:

VIN -> ALGORITHM -> INDEX
INDEX -> ALGORITHM REVERSED -> VIN 

【问题讨论】:

    标签: compression encode vin


    【解决方案1】:

    每个字符都成为可变基整数中的一个数字。然后将这些数字转换为整数。

    可以是数字或23个字母之一的以33为底。只能是数字的以10为底。可能的组合总数为3310乘以104。以 2 为底的对数是 63.73,因此它正好适合 64 位整数。

    你从零开始。添加第一个数字。乘以下一位的底数(33 或 10)。添加那个数字。继续,直到处理完所有数字。你有整数。每个数字是 0..32 或 0..9。注意将不连续的字母正确转换为连续的数字 0..32。

    您的字符串 64ABN10E082986 然后被编码为整数 2836568518287652986。(我给数字的值是 0..9,字母是 10..32。)

    您可以通过取整数并将其除以最后一个基数并取模最后一个基数来反转该过程。模数的结果是最后一位。继续除以下一位的商。

    顺便说一句,在美国,VIN 的最后 五个 字符必须是数字。我不知道你为什么只考虑四个。

    【讨论】:

      【解决方案2】:

      为每个有效字符/数字分配一个 6 位数字,并将所有十个数字编码为少于 64 位。这意味着它将适合 8 个字节,即 C/C++ 中的 uint64_t,并且很容易存储在数据库等中。

      计算有效字节数

      echo -n "1234567890ABCDEFGHJKLMNPRSTUVWXYZ"| wc -c
      33
      

      允许33 的最小位数是610 * 6 = 60

      如果这个想法是让它尽可能小,长度可能会根据 VIN 而变化,那么这将是一个不同的答案,并且查看 VIN 的实际维基百科页面可能有很多方法可以做到这一点。

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        相关资源
        最近更新 更多