Luhn sağlama doğrularken, ancak bunları üretmek için çok az için uygulamaların çok sayıda bulunmaktadır. Ben ancak benim testlerde o adamcağız olmak için ortaya koymuştur this one geldim ve ben delta değişken, arkasındaki mantığı anlamıyorum.
Ben sözde Luhn sağlama oluşturulan ama henüz anlamış değil nedense oluşturulan sağlama zaman geçersiz yarısı bu işlevi yaptık.
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);
}
Bazı örnekler:
Luhn(3); // 37, invalid
Luhn(37); // 372, valid
Luhn(372); // 3728, invalid
Luhn(3728); // 37283, valid
Luhn(37283); // 372837, invalid
Luhn(372837); // 3728375, valid
Ben oluşturulan toplamlarını against this page, burada yanlış ne yapıyorum doğrulayarak ediyorum?
For future reference, here is the working function.
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;
}
Bu amaçla gerek yok, ve doğrulamak için çünkü ben $ paritesi değişken düştü:
function Luhn_Verify($number, $iterations = 1)
{
$result = substr($number, 0, - $iterations);
if (Luhn($result, $iterations) == $number)
{
return $result;
}
return false;
}