Як визначають відсутність помилки номера карти в платіжних сервісах, невже вони, щоб перевірити чи правильно користувач увів номер карти відправляють його до банків - ні все простіше. Як це зробити без відправки запиту до банку? Дуже просто, потрібно застосувати алгоритм Луна.
Що собою являє цей алгоритм - беремо номер карти із 16 цифр, з них беремо 1-шу, 3-тю, 5-ту, 7-му, 9-ту, 11-ту, 13-ту, 15-ту - цифру і множимо її на 2 і ставимо на місце (якщо в процесі множення на 2 число перевищує, або рівне 10 то додаємо дві цифри цього числа, тобто у випадку із 12 - 1+2 і буде 3). Фінальний крок сумуємо усі цифри номера карти після обробки та результат має ділитися на 10 без залишку інакше номер карти є неправильним.
Все це можливо, тому що остання цифра номера карти є контрольною і завдяки їй вдається перевіряти правильність номера карти (щось типу хеша md5).
По кроках.
Крок 1.
Беремо кожну другу цифру номера і множимо на 2, якщо результат понад 10, то сумуємо цифри числа між собою. Ставимо результат на місце.
Крок 2
Сумуємо всі цифри карти між собою.
Крок 3
Результат скасування має ділитися на 10 без залишку інакше номер карти неправильний.
Приклад коду на python.
nb = list('<credit_cart_number_16_digits>')
for x in [0, 2, 4, 6, 8, 10, 12, 14]:
r = int(nb[x]) * 2
if r >= 10:
r = int(list(str(r))[0]) + int(list(str(r))[1])
nb[x] = str(r)
sn = 0
for i in nb:
sn += int(i)
if sn % 10 == 0:
print('Number bank cart correct!')
else:
print('invalid cart number')
Висновок.
Такий алгоритм дуже корисний для перевірки правильності номерів, він багато де використовується: номери IMEI, американських NPIN