Генерация контрольных сумм Luhn

Существует множество реализаций для проверки контрольных сумм Luhn, но очень мало для их генерации. Я'мы сталкиваемсяэтот Однако в моих тестах он показал, что глючит, и я нене понимаю логику дельта-переменной.

мы сделали эту функцию, которая предположительно должна генерировать контрольные суммы Луна, но по какой-то причине я неt еще не понял, что сгенерированные контрольные суммы недопустимы в половине случаев.

function Luhn($number, $iterations = 1)
{
    while ($iterations-- >= 1)
    {
        $stack = 0;
        $parity = strlen($number) % 2;
        $number = str_split($number, 1);

        foreach ($number as $key => $value)
        {
            if ($key % 2 == $parity)
            {
                $value *= 2;

                if ($value > 9)
                {
                    $value -= 9;
                }
            }

            $stack += $value;
        }

        $stack = 10 - $stack % 10;

        if ($stack == 10)
        {
            $stack = 0;
        }

        $number[] = $stack;
    }

    return implode('', $number);
}

Некоторые примеры: я

Luhn(3); // 37, invalid
Luhn(37); // 372, valid
Luhn(372); // 3728, invalid
Luhn(3728); // 37283, valid
Luhn(37283); // 372837, invalid
Luhn(372837); // 3728375, valid

м проверки сгенерированных контрольных суммпротив этой страницычто я тут не так делаю?

Для дальнейшего использования, вот рабочая функция.

function Luhn($number, $iterations = 1)
{
    while ($iterations-- >= 1)
    {
        $stack = 0;
        $number = str_split(strrev($number), 1);

        foreach ($number as $key => $value)
        {
            if ($key % 2 == 0)
            {
                $value = array_sum(str_split($value * 2, 1));
            }

            $stack += $value;
        }

        $stack %= 10;

        if ($stack != 0)
        {
            $stack -= 10;
        }

        $number = implode('', array_reverse($number)) . abs($stack);
    }

    return $number;
}

Я опустил переменную $ parity, так как мы неЭто нужно для этой цели и для проверки:

function Luhn_Verify($number, $iterations = 1)
{
    $result = substr($number, 0, - $iterations);

    if (Luhn($result, $iterations) == $number)
    {
        return $result;
    }

    return false;
}

Ответы на вопрос(5)

Ваш ответ на вопрос