Luhn算法的实现

Mit*_*ril 14 javascript algorithm luhn

我正在尝试实现信用卡号码的简单验证.我在维基百科上读到了Luhn算法:

  1. 从最右边的校验位开始计数,然后向左移动,将每第二个数字的值加倍.
  2. 将产品的数字(例如,10:1 + 0 = 1,14:1 + 4 = 5)与原始数字中的无数数字相加.
  3. 如果总模数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)

  • 或者你注意不要传递错误的值...... :) (2认同)

yng*_*ccc 9

该数组[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)

您列出的算法只是对所有数字和每个偶数点数进行求和,使用数组查找差值,并将其应用于总和.


kol*_*pto 5

紧凑型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/

  • 注意:此实现仍然不适用于从Paypal的有效测试信用卡列表中获取的一些卡:http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm (2认同)
  • 不适用于我尝试过的有效 9 位数字。它总是返回 true。 (2认同)