Лун алгоритм или формула Лун, также известный как « модуль 10» или « по модулю 10» алгоритм, названный в честь его создателя, IBM ученый Ханс Петер Лун, это простая контрольная формула используется для проверки различных идентификационных номеров, таких как кредит номера карт, номер IMEI, номер идентификатора национального провайдера в Соединенных Штатах, канадское социальное страхование число, израильские идентификационные номера, южноафриканские идентификационные номера, Swedish национальных идентификационные номера, шведский Фирменный стиль номер (OrgNr), греческие номера социального страхования (ΑΜΚΑ), Номера SIM-карт и коды опросов, указанные в квитанциях McDonald's, Taco Bell и Tractor Supply Co. Он описан в патенте США № 2,950,048, выданном 23 августа 1960 г.
Алгоритм является общественным достоянием и широко используется сегодня. Он указан в ISO / IEC 7812-1. Он не предназначен для использования в качестве криптографически безопасной хеш-функции ; он был разработан для защиты от случайных ошибок, а не от злонамеренных атак. Большинство кредитных карт и многие государственные идентификационные номера используют алгоритм в качестве простого метода отличия действительных номеров от набранных с ошибками или иным образом неправильных номеров.
Контрольная цифра вычисляется следующим образом:
Предположим, пример номера счета «7992739871» (только «полезная нагрузка», контрольная цифра еще не включена):
7 | 9 | 9 | 2 | 7 | 3 | 9 | 8 | 7 | 1 | |
Множители | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 |
---|---|---|---|---|---|---|---|---|---|---|
знак равно | знак равно | знак равно | знак равно | знак равно | знак равно | знак равно | знак равно | знак равно | знак равно | |
7 | 18 | 9 | 4 | 7 | 6 | 9 | 16 | 7 | 2 | |
Сумма цифр | 7 | 9 (1 + 8) | 9 | 4 | 7 | 6 | 9 | 7 (1 + 6) | 7 | 2 |
Сумма полученных цифр 67.
Контрольная цифра равна.
Это делает полный номер счета 79927398713.
Просто обрежьте контрольную цифру (последнюю цифру) числа для подтверждения. 79927398713 -gt; 7992739871 Вычислите контрольную цифру (см. Выше) (3) и сравните свой результат с контрольной цифрой, которую вы отсекли (3 = 3). Если они совпадают, число прошло проверку.
Алгоритм Луна обнаружит любую ошибку, связанную с одной цифрой, а также почти все перестановки соседних цифр. Однако он не обнаружит транспонирование двузначной последовательности 09 в 90 (или наоборот). Он обнаружит большинство возможных двойных ошибок (он не обнаружит 22 ↔ 55, 33 ↔ 66 или 44 ↔ 77).
Другие, более сложные алгоритмы проверки цифр (например, Verhoeff алгоритм и алгоритм Дамм ) могут обнаружить больше ошибок транскрипции. Лун мод N алгоритм является расширением, которое поддерживает нечисловые строки.
Поскольку алгоритм работает с цифрами справа налево, а нулевые цифры влияют на результат только в том случае, если они вызывают сдвиг позиции, заполнение нулями начала строки чисел не влияет на вычисления. Следовательно, системы, которые дополняют определенное количество цифр (например, путем преобразования 1234 в 0001234), могут выполнять проверку Luhn до или после заполнения и достигать того же результата.
Алгоритм появился в патенте США на портативное механическое устройство для вычисления контрольной суммы. Следовательно, требовалось, чтобы это было достаточно просто. Механическим способом устройство взяло мод 10 сум. Эти замены цифры, то есть, результаты двойной и сокращения процедуры, не были получены механическим способом. Скорее, цифры были отмечены на корпусе машины в порядке их перестановки.
function checkLuhn(string purportedCC) { int nDigits := length(purportedCC) int sum := integer(purportedCC[nDigits-1]) int parity := (nDigits-1) modulus 2 for i from 0 to nDigits - 2 { int digit := integer(purportedCC[i]) if i modulus 2 = parity digit := digit × 2 if digit gt; 9 digit := digit - 9 sum := sum + digit } return (sum modulus 10) = 0 }