Открыть сервис

Алгоритм Luhn

Алгоритм Luhn — это простой алгоритм проверки контрольной суммы, используемый для валидации идентификационных номеров, таких как номера кредитных карт, IMEI-коды, номера социального страхования (в некоторых странах) и другие. Алгоритм предназначен для обнаружения случайных ошибок при вводе или передаче данных, в частности, одиночных ошибок в цифре и большинства перестановок соседних цифр. Он не является криптографически стойким и не предназначен для защиты от злонамеренных атак.

История

Алгоритм был разработан в 1954 году Гансом Петером Луном (Hans Peter Luhn), работавшим в компании IBM. Первоначально он был запатентован в США (патент № 2 950 048, подан в 1954 году, выдан в 1960 году). Изначально алгоритм предназначался для использования в механических устройствах для проверки номеров, но впоследствии получил широкое распространение в цифровых системах. В 1970-х годах алгоритм Luhn стал стандартом для проверки номеров кредитных карт, выпускаемых по стандарту ISO/IEC 7812.

Принцип работы

Алгоритм Luhn основан на вычислении контрольной суммы по модулю 10. Он работает с последовательностью цифр, начиная с самой правой (младшей) цифры, которая считается контрольной.

Этапы вычисления

  1. Подготовка: Исходный номер (без контрольной цифры) дополняется контрольной цифрой, или проверяется уже существующий номер с контрольной цифрой.
  2. Удвоение: Начиная с самой правой цифры (контрольной) и двигаясь влево, каждая вторая цифра удваивается. Если результат удвоения больше или равен 10, то цифры полученного числа складываются (например, 7 × 2 = 14 → 1 + 4 = 5) или, что эквивалентно, из результата вычитается 9.
  3. Суммирование: Все цифры (как удвоенные, так и не удвоенные) складываются.
  4. Проверка: Если полученная сумма делится на 10 без остатка (то есть сумма mod 10 = 0), то номер считается корректным. В противном случае номер недействителен.

Пример расчёта

Рассмотрим номер карты: 4992 7398 7160 1597 (контрольная цифра — последняя, 7).

  1. Начинаем с правой цифры (7) и удваиваем каждую вторую цифру, двигаясь влево:
  1. Суммируем все полученные цифры (включая неудвоенные):
  1. Проверяем: 76 mod 10 = 6 ≠ 0. Номер недействителен.

Исправленный пример: Для корректного номера, например 4992 7398 7160 1596 (контрольная цифра 6), сумма будет равна 70, что делится на 10 без остатка.

Применение

Алгоритм Luhn используется в различных областях, где требуется быстрая и простая проверка целостности цифровых данных:

Критика и ограничения

Алгоритм Luhn обладает рядом недостатков:

Несмотря на эти ограничения, алгоритм Luhn остаётся широко распространённым благодаря своей простоте, скорости и эффективности для выявления случайных ошибок ввода, что является его основной целью.

Реализация

Алгоритм Luhn легко реализуется программно. Ниже приведён пример на псевдокоде:

`` function luhnCheck(cardNumber): sum = 0 alternate = false for i from length(cardNumber)-1 down to 0: digit = cardNumber[i] if alternate: digit = digit * 2 if digit > 9: digit = digit - 9 sum = sum + digit alternate = not alternate return (sum % 10 == 0) ``

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →