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