Mit*_*ril 14 javascript algorithm luhn
我正在尝试实现信用卡号码的简单验证.我在维基百科上读到了Luhn算法:
- 从最右边的校验位开始计数,然后向左移动,将每第二个数字的值加倍.
- 将产品的数字(例如,10:1 + 0 = 1,14:1 + 4 = 5)与原始数字中的无数数字相加.
- 如果总模数10等于0(如果总数以零结束)则该数字根据Luhn公式有效; 否则它无效.
在维基百科上,很容易理解Luhn算法的描述.但是,我还在Rosetta Code和其他地方看到了Luhn算法的其他实现.
这些实现工作得很好,但我很困惑为什么他们可以使用数组来完成工作.他们使用的数组似乎与Luhn算法无关,我无法看到他们如何实现维基百科上描述的步骤.
他们为什么要使用数组?它们有什么意义,它们如何用于实现维基百科所描述的算法?
Ron*_*Ron 11
不幸的是,上面的代码都没有为我工作.但我在GitHub上找到了一个有效的解决方案
// takes the form field value and returns true on valid number
function valid_credit_card(value) {
// accept only digits, dashes or spaces
if (/[^0-9-\s]+/.test(value)) return false;
// The Luhn Algorithm. It's so pretty.
var nCheck = 0, nDigit = 0, bEven = false;
value = value.replace(/\D/g, "");
for (var n = value.length - 1; n >= 0; n--) {
var cDigit = value.charAt(n),
nDigit = parseInt(cDigit, 10);
if (bEven) {
if ((nDigit *= 2) > 9) nDigit -= 9;
}
nCheck += nDigit;
bEven = !bEven;
}
return (nCheck % 10) == 0;
}
Run Code Online (Sandbox Code Playgroud)
该数组[0,1,2,3,4,-4,-3,-2,-1,0]用作查找数组,用于查找0-9中的数字与其值的2倍的数字之和之间的差异.例如,对于数字8,8和(2*8)= 16 - > 1 + 6 = 7之间的差值是7-8 = -1.
这是图形表示,其中{n}代表n的数字之和
[{0*2}-0, {1*2}-1, {2*2}-2, {3*2}-3, {4*2}-4, {5*2}-5, {6*2}-6, {7*2}-7....]
| | | | | | | |
[ 0 , 1 , 2 , 3 , 4 , -4 , -3 , -2 ....]
Run Code Online (Sandbox Code Playgroud)
您列出的算法只是对所有数字和每个偶数点数进行求和,使用数组查找差值,并将其应用于总和.
紧凑型Luhn验证器:
var luhn_validate = function(imei){
return !/^\d+$/.test(imei) || (imei.split('').reduce(function(sum, d, n){
return n===(imei.length-1)
? 0
: sum + parseInt((n%2)? d: [0,2,4,6,8,1,3,5,7,9][d]);
}, 0)) % 10 == 0;
};
Run Code Online (Sandbox Code Playgroud)
适用于CC和IMEI号码.小提琴:http://jsfiddle.net/8VqpN/