Проверка корректности введеного номера пластиковой карты по алгоритму Луна

Проверка корректности введеного номера пластиковой карты по алгоритму Луна

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

Для начала немного об этом алгоритме:

Агоритм Лу?на (англ. Luhn algorithm) — алгоритм вычисления контрольной цифры номера пластиковых карт в соответствии со стандартом ISO/IEC 7812. Не является криптографическим средством, предназначение алгоритма в первую очередь — выявление ошибок, вызванных непреднамеренным искажением данных (например, при ручном вводе номера карты, при приёме данных о номере социального страхования по телефону). Позволяет лишь с некоторой степенью достоверности судить об отсутствии ошибок в блоке цифр, но не даёт возможности локализации и коррекции обнаруженной неточности.

  1. Цифры проверяемой последовательности нумеруются справа налево.
  2. Цифры, оказавшиеся на нечётных местах, остаются без изменений.
  3. Цифры, стоящие на чётных местах, умножаются на 2.
  4. Если в результате такого умножения возникает число больше 9, оно заменяется суммой цифр получившегося произведения — однозначным числом, т. е. цифрой.
  5. Все полученные в результате преобразования цифры складываются. Если сумма кратна 10, то исходные данные верны

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

<?php
function mooncheck( $num ) {
    $n = strlen( $num );
    if ( $n > 0 ) {
        for ( $i=0; $i <= $n; $i++ ) {
            $p = $num[$n-$i-1];
            if ( $i % 2 != 0 ) {
                $p = 2 * $p;
                if ( $p > 9 ) {
                    $p = $p - 9;
                }
            }
            $sum = $sum + $p;
        }
        if ( $sum % 10 == 0 ) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
echo mooncheck( '4561261212345467' );
?>

ЗЫ Номер карточки взят из википедии :) ))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *