0

假设我有这样的VINSB164ABN10E082986:。

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

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

1234567890 ABCDEFGH JKLMN P RSTUVWXYZ

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

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

这是它应该如何工作的:

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

2 回答 2

1

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

计算有效字节数

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

允许的最小位数33610 * 6 = 60

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

于 2016-04-23T01:25:26.227 回答
1

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

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

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

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

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

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

于 2016-04-23T04:50:19.060 回答