Что я должен использовать в качестве алгоритма контрольной цифры для базового значения 31? - PullRequest
4 голосов
/ 06 февраля 2009

Я использую следующий набор значений для создания 9-значного базового значения 31:
0123456789ABCDEFGHJKLMNPQRTUWXY

Я пытался изменить алгоритм Луна для работы с моей базой.

Мой вопрос:

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

Должен ли я по-прежнему удваивать свои четные значения позиции или использовать более высокий множитель?

Я пытаюсь защитить от транспонированных символов, пропущенных символов, лишних символов и просто неправильных цифр.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2009

Я изучил алгоритм Luhn mod N, но он очень ограничен в том, что он может проверить.

Я решил использовать модифицированную версию системы грузовых контейнеров.

Система транспортных контейнеров умножает каждое значение на 2 ^ [позиция] (позиция начинается с 0), а затем выполняет модуль 11 для результата, чтобы получить контрольную цифру 10 (результат 10 не рекомендуется).

В этом случае хитрость заключается в том, чтобы найти значения в диапазоне от x ^ 0 до x ^ [длина], которые не делятся равномерно на число, которое вы используете для модуля.

Я решил использовать 3 ^ [position] в качестве множителя и выполнить модуль 31 для суммы, чтобы получить контрольную цифру.

Как пример: 0369CFJMK

Character  0     3     6     9     C     F     J     M     K
Value      0     3     6     9     12    15    18    21    19
--------------------------------------------------------------
Multiplier 1     3     9     27    81    243   729   2187
Result     0     9     54    243   972   3645  13122 45927

Total      63972 MOD 31 = 19

Похоже, что с такими алгоритмами основное требование заключается в том, чтобы множитель не делился на основание равномерно и чтобы шаблон остатков не повторялся в пределах длины кода, который вы хотите проверить.

2 голосов
/ 06 февраля 2009

Не изобретайте велосипед - используйте Luhn mod N .

...