2016-04-22 2 views
0

Допустим, что у меня есть VIN вот так: SB164ABN10E082986.Назначение отдельного номера строке

Теперь я хочу назначить целое число для каждого возможного VIN (без WMI, который является первыми тремя цифрами ->64ABN10E082986) таким образом, что после этого я получаю VIN из этого целого числа.

Что было бы лучшим способом сделать это? Он может быть использован в пользу такого алгоритма, что первые 10 цифр могут состоять из этих значений:

1234567890 ABCDEFGH JKLMN P RSTUVWXYZ 

и последний 4 может состоять из всех однозначных чисел (0-9).

Фон: Я хочу, чтобы иметь возможность сохранять память. Итак, в некотором смысле я ищу специальный способ сжатия. Я подсчитал, что в этих условиях достаточно 8 байтовых чисел. Я просто пропускаю способ сделать «сопоставление».

Вот как это должно работать:

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

ответ

1

Каждый символ становится цифрой в целочисленном переменном значении. Затем преобразуйте эти цифры в целое число.

Те, которые могут быть цифрами или один из 23 букв является базой 33. Те, которые могут быть только цифры являются базовыми 10. Общее число возможных комбинаций составляет 33 раз 10 . Логарифмическая база двух из них составляет 63,73, поэтому она будет просто соответствовать 64-битовому целому.

Вы начинаете с нуля. Добавьте первую цифру. Умножьте базу следующей цифрой (33 или 10). Добавьте эту цифру. Продолжайте, пока все цифры не будут обработаны. У вас есть целое число. Каждая цифра равна 0..32 или 0..9. Позаботьтесь о правильном преобразовании несмежных букв в непрерывные числа 0..32.

Ваша строка 64ABN10E082986 затем кодируется как целое 2836568518287652986. (я дал цифры от значения 0..9 и буквы 10..32.)

Вы можете полностью изменить процесс, взяв целое число и оба разделили его на последнюю базу и взяли по модулю последнюю базу. Результатом по модулю является последняя цифра. Продолжайте с делителем для следующей цифры.

Кстати, в США в любом случае последние пять символов VIN должны быть числовыми. Я не знаю, почему вы рассматриваете только четыре.

+0

именно то, что я искал, спасибо –

1

Назначьте 6 разрядное число для каждого допустимого символа/цифры и закодировать все десять меньше, чем 64 бита. Это означает, что она будет соответствовать в 8 байт, т.е. uint64_t в C/C++ и будет легко хранить в базе данных и т.д.

Графа действительный байт

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

Минимальное число битов, чтобы 33 является 6. 10 * 6 = 60

Если идея состоит в том, чтобы сделать ее как можно меньшей, где длина может варьироваться в зависимости от VIN, тогда это будет другой ответ и посмотрите на фактическую страницу википедии для VIN, скорее всего, есть несколько способов сделать это ,