2011-11-24 3 views
7

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

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

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

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

Будет ли любое значительное преимущество в использовании Verhoeff над Лун?

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

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

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

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

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

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

ответ

8

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

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

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

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

(я понятия не имею, как вам удалось проверить свои карты с этим алгоритмом ЭФИР вам повезло, или ваш код сломан, или я не прав ....)

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

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

+0

После прочтения вашего ответа я также смущен тем, как я проверил свои карты. Я проверил 2 разных карты, один говорит mastercard, один говорит о визе, и оба они «проверены». После прочтения вашего ответа я собираюсь попытаться больше изучить это, и я, конечно же, буду ждать, чтобы узнать, какие могут быть другие ответы;) Спасибо за ваше время! –

+4

Пример действительной PAN; 5555555555554444 luhn = pass verhoeff = fail –

+0

Еще раз спасибо за ваш ответ andrew. Я думаю, что я просто сделаю это до удачи. Но теперь вы помогли мне понять это намного лучше, и Алекс К, благодарю вас за ваш пример. –

Смежные вопросы