为字符串分配不同的数字

Assigning a distinct number to a string

假设我有一个像这样的 VINSB164ABN10E082986.

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

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

1234567890 ABCDEFGH JKLMN P RSTUVWXYZ

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

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

的方法

它应该是这样工作的:

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

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

计算有效字节数

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

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

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

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

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

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

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

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

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