- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
验证 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,则该数字有效。
现在,您的问题暗示您想知道如何生成校验和,好吧,这很简单,请执行以下操作:
例子:数字是 12345
计算 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
求和 (15),模数 10,得到 5
所以结果是123455。
关于php - 生成 Luhn 校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1418964/
如何在 PHP 中生成 CRC-8 校验和? 最佳答案 function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 CRC 操作的 XOR 函数的返回值时,它总是打印 0。我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚! 这是我的
ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下: 显示验证码 首先在Home/Controller下创建一个公共控制器PublicController
我想将自定义验证绑定(bind)到 TimePicker 自定义控件,但下面的代码显示“无法将内容添加到 TimePicker 的对象类型。”。
目录 Spring 校验(validator,JSR-303)实现 什么是JSR-303规范 与Spring MVC结合 实体类添加
导包和配置 导入 JSR 303 的包、hibernate valid 的包 ?
我是一名优秀的程序员,十分优秀!