Compression 为字符串指定一个不同的数字

Compression 为字符串指定一个不同的数字,compression,encode,vin,Compression,Encode,Vin,假设我有一个这样的例子:SB164ABN10E082986 现在,我想给每个可能的VIN分配一个整数(不带WMI,它是前三位->64ABN10E082986),这样我就可以从这个整数中检索VIN 这样做的最佳方式是什么?该算法的优点在于,前10位数字可由以下值组成: 1234567890 ABCDEFGH JKLMN P RSTUVWXYZ 最后4个数字可以由所有一位数组成(0-9) 背景:我希望能够节省内存。所以,在某种意义上,我正在寻找一种特殊的压缩方式。我计算出,在这些条件下,一个8字节

假设我有一个这样的例子:
SB164ABN10E082986

现在,我想给每个可能的VIN分配一个整数(不带WMI,它是前三位->
64ABN10E082986
),这样我就可以从这个整数中检索VIN

这样做的最佳方式是什么?该算法的优点在于,前10位数字可由以下值组成:

1234567890 ABCDEFGH JKLMN P RSTUVWXYZ
最后4个数字可以由所有一位数组成(
0-9

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

这就是它的工作原理:

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

为每个有效字符/数字分配一个6位数字,并将所有10个字符/数字编码为64位以下。这意味着它将适合C/C++中的8字节ie
uint64\t
,并且很容易存储在数据库中等

计算有效字节数

echo -n "1234567890ABCDEFGHJKLMNPRSTUVWXYZ"| wc -c
33
允许
33
的最小位数为
6
<代码>10*6=60


如果想法是使其尽可能小,长度可能根据VIN变化,那么这将是一个不同的答案,查看实际的wikipedia页面上的VIN,可能有很多方法可以做到这一点。

为每个有效字符/数字分配一个6位数字,并在不到64位的情况下对所有10个字符/数字进行编码。这意味着它将适合C/C++中的8字节ie
uint64\t
,并且很容易存储在数据库中等

计算有效字节数

echo -n "1234567890ABCDEFGHJKLMNPRSTUVWXYZ"| wc -c
33
允许
33
的最小位数为
6
<代码>10*6=60


如果想法是使其尽可能小,长度可能根据VIN变化,那么这将是一个不同的答案,查看实际的wikipedia页面上的VIN,可能有很多方法可以做到这一点。

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

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

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

然后将字符串
64ABN10E082986
编码为整数283656858287652986。(我给了数字0..9和字母10..32。)

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


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

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

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

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

然后将字符串
64ABN10E082986
编码为整数283656858287652986。(我给了数字0..9和字母10..32。)

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

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