gpt4 book ai didi

php - 生成 Luhn 校验和

转载 作者:可可西里 更新时间:2023-10-31 22:11:55 26 4
gpt4 key购买 nike

验证 Luhn 校验和的实现有很多,但生成校验和的实现却很少。我遇到过this one然而,在我的测试中,它被发现有问题,我不明白 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

我正在验证生成的校验和 against this page ,我在这里做错了什么?


为了将来引用,这里是工作函数。

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;
}

最佳答案

编辑:抱歉,我现在意识到您几乎已经得到了我的全部答案,您只是错误地确定了将哪个因数用于哪个数字。

现在我的整个回答可以用这一句话来概括:

您将因数取反了,您将错误的数字乘以 2,具体取决于数字的长度。


看看 Wikipedia article on the Luhn algorithm .

您的校验和有一半时间无效的原因是,在您的支票中,有一半时间您的号码有奇数位,然后您将错误的数字加倍。

对于 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。

如果您最终得到的数字以零结尾,例如 20,则该数字有效。

现在,您的问题暗示您想知道如何生成校验和,好吧,这很简单,请执行以下操作:

  1. 添加一个额外的零,这样您的号码就从 xyxyxyxy 变为 xyxyxyxy0
  2. 计算新数的luhn校验和
  3. 求和,对 10 取模,得到 0 到 10 之间的单个数字
  4. 如果数字为 0,那么恭喜,您的校验和数字为零
  5. 否则,计算 10 位数字以获得您需要的最后一位数字,而不是那个零

例子:数字是 12345

  1. 钉零:123450
  2. 计算 123450 的 luhn 校验和,结果为

    0   5    4    3    2    1
    1 2 1 2 1 2 <-- factor
    0 10 4 6 2 2 <-- product
    0 1 0 4 6 2 2 <-- sum these to: 0+1+0+4+6+2+2=15
  3. 求和 (15),模数 10,得到 5

  4. 数字(5),不为零
  5. 计算 10-5,得到 5,最后一位应该是 5。

所以结果是123455。

关于php - 生成 Luhn 校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1418964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com