Алгоритм проверки чисел Luhn mod N против простой суммы - PullRequest
1 голос
/ 05 апреля 2011

Знаете ли вы, почему алгоритм Luhn mod N для создания контрольной цифры выполняет суммирование, удваивая значение каждого четного размещенного символа вместо простой суммы всех символов?

В псевдокодовых словах:

дано:

var s = "some string i want to create check digit";

знаете ли вы, почему Luhn mod N делает в основном это:

for(i from s.length-1 to 0)
   if(i is even)
      checkdigit += chr2int(s[i]) * 2;
   else
      checkdigit += chr2int(s[i]);

вместо простого выполнениясумма

for(i from s.length-1 to 0)
   checkdigit += chr2int(s[i]);

они могут оба завершаться с помощью операции mod, чтобы контрольная цифра помещалась в один символ

return int2chr( chr2int('a') + (checkdigit mod 25) );

Как примечание кэтот вопрос, для кого он может быть заинтересован в графическом представлении алгоритма Луна, который делает его еще более простым для понимания:

enter image description here

Собственно этоторигинальный алгоритм Луна, которому даже не нужно использовать функцию MOD.

1 Ответ

4 голосов
/ 05 апреля 2011

Контрольные символы предназначены для предотвращения случайного искажения ввода, например, когда клерк вводит число с клавиатуры.

Если используется только сумма, обе строки "ABCD" и "ABDC" приведут кта же контрольная сумма («A» + «B» + «C» + «D»), поэтому простые ошибки свопинга могут произойти незамеченными.

Однако, принимая во внимание четность, «ABCD» и «ABDC» станут(2 "A" + "B" +2 "C" + "D") и (2 "A" + "B" + "C" +2 "D") соответственно, которые (вероятно) являются различными числами, поэтомутаким образом мы могли бы определить, были ли два символа случайно заменены.

...