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") соответственно, которые (вероятно) являются разными числами, поэтому таким образом мы могли определить, были ли два символа случайно заменены.