Istnieje wiele implementacji do sprawdzania poprawności sum kontrolnych Luhna, ale bardzo niewiele do ich generowania. Natknąłem się na this one, ale w moich testach okazało się, że jest błędny i nie rozumiem logiki kryjącej się za zmienną delta.Generowanie sum kontrolnych Luhna
Zrobiłem tę funkcję, która rzekomo powinna generować sumy kontrolne Luhna, ale z jakiegoś powodu nie zrozumiałem jeszcze, że wygenerowane sumy kontrolne są nieważne przez połowę czasu.
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);
}
Kilka przykładów:
Luhn(3); // 37, invalid
Luhn(37); // 372, valid
Luhn(372); // 3728, invalid
Luhn(3728); // 37283, valid
Luhn(37283); // 372837, invalid
Luhn(372837); // 3728375, valid
Jestem sprawdzania sum kontrolnych wygenerowanych against this page, co robię źle tutaj?
Poniżej znajduje się funkcja robocza.
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;
}
rzuciłem zmienną $ parzystości ponieważ nie trzeba go do tego celu, a do sprawdzenia:
function Luhn_Verify($number, $iterations = 1)
{
$result = substr($number, 0, - $iterations);
if (Luhn($result, $iterations) == $number)
{
return $result;
}
return false;
}
Swoją drogą, weryfikacja sumy kontrolnej jest identyczna z wygenerowaniem i sprawdzeniem, czy jest równa zero - więc wszystkie te procedury "weryfikujące" mogą być również użyte do wygenerowania. –
@Nick: Tak, ale to wymaga sprawdzenia 10 różnych cyfr, wolę na odwrót (sprawdź za pomocą funkcji generowania). –
Co? Nie, wystarczy "zweryfikować" numer z dodanym 0, a następnie zastąpić ostatnią cyfrę (9-wynik). –