让我们说我有VIN这样:SB164ABN10E082986
。
现在,我想为每个可能的VIN(没有WMI,前三个数字 - > 64ABN10E082986
)分配一个整数,以后我从这个整数中检索VIN。
最好的方法是什么?它可以用于这样的算法的优点,即前10个数字可以由这些值组成:
1234567890 ABCDEFGH JKLMN P RSTUVWXYZ
,最后4个可以由所有一位数字组成(0-9
)。
背景:我希望能够节省内存。所以,从某种意义上说,我正在寻找一种特殊的压缩方式。我计算出在这些条件下,一个8字节的整数就足够了。我只是错过了做"映射"。
的方式这是它应该如何运作的:
VIN -> ALGORITHM -> INDEX
INDEX -> ALGORITHM REVERSED -> VIN
答案 0 :(得分:1)
为每个有效字符/数字分配一个6位数字,并在少于64位中对所有十个进行编码。这意味着它适合8字节,即C / C ++中的uint64_t
,并且很容易存储在数据库等中。
计算有效字节
echo -n "1234567890ABCDEFGHJKLMNPRSTUVWXYZ"| wc -c
33
允许33
的最小位数为6
。 10 * 6 = 60
如果想要让它尽可能小,其中长度可能因VIN而异,那么这将是一个不同的答案,并且查看VIN的实际维基百科页面可能有很多方法可以做到这一点。 / p>
答案 1 :(得分:1)
每个字符都变成一个基于变量的整数中的数字。然后将这些数字转换为整数。
那些可以是数字或23个字母中的一个是基数33.那些只能是数字的是基数10.可能组合的总数是33 10 乘以10 4 < / SUP>。对数基数为63.73,因此它只适合64位整数。
你从零开始。添加第一个数字。乘以下一个数字(33或10)的基数。添加该数字。继续,直到处理完所有数字你有整数。每个数字为0..32或0..9。注意将不连续的字母正确转换为连续的数字0..32。
然后将您的字符串64ABN10E082986
编码为整数2836568518287652986。(我给数字的值为0..9,字母为10..32。)
您可以通过取整数并将其除以最后一个基数并将模数作为最后一个基数来反转该过程。模数的结果是最后一位数。继续使用除以下一位数的商。
顺便说一下,在美国,VIN的最后五个字符必须是数字。我不知道为什么你只考虑四个。