Я изучил алгоритм 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
Похоже, что с такими алгоритмами основное требование заключается в том, чтобы множитель не делился на основание равномерно и чтобы шаблон остатков не повторялся в пределах длины кода, который вы хотите проверить.