有许多用于验证Luhn校验和的实现,但用于生成它们的实现很少。然而,在我的测试中,我遇到了这一个,它显示出它是有缺陷的,并且我不理解delta变量背后的逻辑。
我已经做了这个函数,应该会生成Luhn校验和,但是由于某些原因,我还没有理解生成的校验和在一半的时间内是无效的。
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;
}发布于 2009-09-13 22:12:02
编辑:对不起,我现在意识到你已经得到了我的全部答案,你只是错误地决定了哪个因素用于哪个数字。
我现在的整个答案可以用以下一句话来概括:
你的因子被颠倒了,你将错误的数字乘以2,这取决于数字的长度。
看一看维基百科关于Luhn算法的文章。
您的校验和一半时间无效的原因是,您的支票,一半的时间,您的数字有一个奇数,然后你翻倍错误的数字。
对于37283,当你从右边数的时候,你会得到这样的数字序列:
3 * 1 = 3 3
8 * 2 = 16 --> 1 + 6 = 7
2 * 1 = 2 2
7 * 2 = 14 --> 1 + 4 = 5
+ 3 * 1 = 3 3
= 20该算法要求您将原始数字中的单个数字和这些“右边的每两位数字”的乘积的单个数字相加。
从右边,你把3 + (1 + 6) +2+ (1 + 4) +3相加,得到20。
如果以0结尾的数字以20结尾,则该数字是有效的。
现在,您的问题暗示您希望知道如何生成校验和,这很简单,请执行以下操作:
例子:号码是12345
结果是123455。
发布于 2010-12-04 09:46:02
您的php是错误的,它会导致无限循环。这是我正在使用的工作版本,从您的代码中修改
函数Luhn($number) { $stack = 0;$number = str_split(strrev ($number ));foreach ( $number as $key => $value) { if ($key %2 == 0) { $value = array_sum(str_split($value * 2));} $stack += $value;} $stack $value 10;if ( != 0) {en21# 10;=abs();}=内嵌(‘’,());=#en28。strval($stack);返回$number; }
创建一个php并在本地主机Luhn(xxxxxxxx)中运行以确认。
发布于 2013-02-06 13:00:05
https://stackoverflow.com/questions/1418964
复制相似问题