Контрольная цифра серийного номера OCR

Я хочу прочитать серийный номер около 16-20 символов (AZ, 0-9) с помощью OCR. Поскольку все символы не будут распознаваться правильно каждый раз, я хочу добавить один контрольный символ к серийному номеру. На данный момент я нашел простой Luhn mod N algo ( Википедия). Этот алгоритм небезопасен в отношении ошибок транспонирования (09 => 90).

Реализация из Википедии:

 char GenerateCheckCharacter(string input) {

    int factor = 2;
    int sum = 0;
    int n = NumberOfValidInputCharacters();

    // Starting from the right and working leftwards is easier since 
    // the initial "factor" will always be "2" 
    **//int index = 0;**
    for (int i = input.Length - 1; i >= 0; i--) {
        int codePoint = CodePointFromCharacter(input[i]);
        int addend = factor * codePoint;

        // Alternate the "factor" that each "codePoint" is multiplied by
        factor = (factor == 2) ? 1 : 2;
        **//factor = index;**


        // Sum the digits of the "addend" as expressed in base "n"
        addend = (addend / n) + (addend % n);
        sum += addend;
        **//index++;**
    }

    // Calculate the number that must be added to the "sum" 
    // to make it divisible by "n"
    int remainder = sum % n;
    int checkCodePoint = (n - remainder) % n;

    return CharacterFromCodePoint(checkCodePoint);
}

NumberOfValidInputCharacters () будет 36 (AZ, 0-9)

Но если я изменю переменную factor на фактический индекс символа внутри серийного номера, будет ли он безопаснее, чем раньше? (см. ** ** строки в коде)

0 ответов

Другие вопросы по тегам