我们再很多情况下都要提供银行卡号,比如入职,办理贷款等。你可能也会担心不小心输错一位数字,然后工资就打到别人的账户里了。其实不必为这种情况担忧,生成卡号的Luhn算法已经考虑周全了。来和我一起研究一下Luhn算法是如何做到的吧。 # Luhm校验的过程: 1、从最后一位数字开始,逆向将奇数位(1、3、5等等)相加。 2、从最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。 3、将奇数位总和加上偶数位总和,结果应该可以被10整除。 例如,卡号是:5432123456788881 则奇数、偶数位(用红色标出)分布:5432123456788881 奇数位和=35 偶数位乘以2(有些要减去9)的结果:16 2 6 1 5 7 7,求和=35。 最后35+35=70可以被10整除,认定校验通过。否则则不通过。 # Luhm校验示例 ```php function luhm($bankNo) { // 奇数之和 $sumOdd = 0; // 偶数之和 $sumEven = 0; // 长度 $length = strlen($bankNo); $wei = []; for ($i = 0; $i < $length; $i++) { $wei[$i] = substr($bankNo, $length - $i - 1, 1);// 从最末一位开始提取,每一位上的数值 } for ($i = 0; $i < $length / 2; $i++) { $sumOdd += $wei[2 * $i]; if(!isset($wei[2 * $i + 1])) continue;// 如果为19位卡号,要防止报Notice: Undefined offset错误 if (($wei[2 * $i + 1] * 2) > 9) $wei[2 * $i + 1] = $wei[2 * $i + 1] * 2 - 9; else $wei[2 * $i + 1] *= 2; $sumEven += $wei[2 * $i + 1]; } if (($sumOdd + $sumEven) % 10 == 0) { return true; } else { return false; } } ``` Luhn算法的目的并不是为了加密,而是为了避免未知的错误,比如输入错误,数字缺失等,并不是为了应对恶意攻击。Luhn算法的应用非常广泛,因为它能很容易的识别错误的输入,很多的银行和政府机构用它来生成,检验卡号和证书编号。 我们可以在填写收款账户的时候,添加一种Luth算法的JS脚本检查用户填写的卡号存在问题。当然即时用户填写的卡号违法了该规则,我们仍然运行用户填写,但给出相应的警示内容(可能填错)。