Checkdigit алгоритм Luhn мод N против простой суммы

Знаете ли вы, почему алгоритм 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) );

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

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

1 ответ

Решение

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

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

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

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