Алгоритм Луна или Верхоффа для номеров кредитных карт

Прежде всего, я не совсем уверен, должно ли это быть в stackoverflow, но я подумал, что все равно попытаюсь спросить.

В прошлом я всегда использовал алгоритм luhn для проверки ошибок в номерах кредитных карт, но сегодня я подумал, что реализую алгоритм verhoeff в php, в основном, чтобы убить время.

Я проверил его на своих собственных номерах карт, и он работал нормально, что заставило меня задуматься о том, следует ли мне использовать verhoeff вместо luhn для проверки ошибок номера моей кредитной карты в будущем.

Теперь мои вопросы:

Может ли использование verhoeff дать существенное преимущество перед luhn?

Я знаю, что verhoeff немного сложнее в своей реализации и может обнаруживать больше ошибок транскрипции, чем luhn, что, естественно, заставило бы меня поверить, что он немного медленнее, но помимо преимущества обнаружения большего количества ошибок транскрипции и недостатка (если вы действительно можете назвать это так) из-за того, что он немного медленнее, я не могу придумать никаких других реальных отличий.

Будет ли алгоритм Верхоффа работать для всех основных карт?

Я знаю, что luhn будет работать для всех основных карт, но будет ли работать verhoeff для всех из них? Я предполагаю, что это сработает для всех из них, но я подумал, что все равно должен проверить.

Есть ли причина, по которой я видел людей, использующих luhn только для проверки номеров кредитных карт?

За все время, что я работал разработчиком, я действительно видел только людей, использующих алгоритм Луна для проверки номеров кредитных карт. Есть ли для этого веская причина, или просто Лун более известен?

Любая помощь будет оценена по достоинству, спасибо за ваше время.


person Lucas    schedule 24.11.2011    source источник


Ответы (1)


Это разные алгоритмы, и они могут давать разные результаты (если бы результаты всегда были одинаковыми, то они были бы равны по мощности — вы уже сказали, что Верхофф был сильнее, поэтому согласитесь, что есть некоторые числа, которые дают разные значения для Луна!) .

При использовании кредитной карты вы сверяете последнюю цифру с остальной частью номера. Эта контрольная цифра присутствует на карте (поэтому зафиксирована) и рассчитывается с использованием алгоритма Луна.

Таким образом, вы не можете использовать Verhoeff, потому что последняя цифра на кредитной карте предназначена для Луна. Чтобы вместо этого использовать Verhoeff, вам придется изменить конечную цифру (некоторых) карт, которые уже существуют.

У людей, которые разработали первоначальный формат кредитной карты, был выбор (по модулю исторических деталей), и они решили пойти с Лун. Они выбирают. Вы не можете изменить их решение задним числом, потому что контрольная цифра Луна присутствует на существующих картах.

(Понятия не имею, как вам удалось проверить свои карты с помощью этого алгоритма. То ли вам повезло, то ли ваш код сломан, то ли я ошибаюсь...)

Проще говоря: не получится. Они не одинаковы, и выбор Luhn был сделан эмитентом кредитной карты.

В более сложных терминах: если бы они были совместимы, то они были бы равны по мощности, и не было бы смысла переключаться. У вас не может быть двух контрольных сумм разной мощности, дающих одинаковые результаты. Это тонкий момент, но подумайте над этим...

person andrew cooke    schedule 24.11.2011
comment
Прочитав ваш ответ, я также запутался в том, как я проверял свои карты. Я проверил 2 разные карты, одна говорит mastercard, другая говорит Visa, и обе они проверены. Прочитав ваш ответ, я попытаюсь больше узнать об этом, и я, конечно, подожду, чтобы увидеть, какие другие ответы могут возникнуть;) Спасибо за ваше время! - person Lucas; 24.11.2011
comment
Пример действительного PAN; 55555555555554444 luhn=пройдено verhoeff=не пройдено - person Alex K.; 24.11.2011
comment
Еще раз спасибо за ответ, Андрей. Думаю, я просто спишу это на удачу. Но вы помогли мне понять это намного лучше, и Алекс К., спасибо за ваш пример. - person Lucas; 24.11.2011