hang0 2017-11-06
1.1Luhn简介
Luhn算法/公式,也称“模10算法”,是一种简单的校验公式,常被用于银行卡卡号、IMEI号等证件号码的识别校验。
需要注意的是Luhn算法存在的目的并不是成为一种加密安全的哈希函数,而在于防止意外操作导致的错误,如错误输入。
Luhn算法英文参考:https://en.wikipedia.org/wiki/Luhn_algorithm#cite_note-0
1.2校验规则
Luhn算法被用于最后一位为校验码的一串数字的校验,通过如下规则计算校验码的正确性:
1、按照从右往左的顺序,从这串数字的右边开始,包含校验码,将偶数位数字乘以2,如果每次乘二操作的结果大于9(如8×2=16),然后计算个位和十位数字的和(如1+6=7)或者用这个结果减去9(如16-9=7)。
2、第一步操作过后会得到新的一串数字,计算所有数字的和(包含校验码)。
3、用第二步操作得到的和进行“模10”运算,如果结果为0,表示校验通过,否则失败。
1.3实例
function bankCheckCodeValidate(str) { var sum=0,evenArr=[],oddArr=[]; var numArr=str.split("").reverse(); for(var i=0;i<numArr.length;i++){ i%2 != 0 ? evenArr.push(numArr[i]*2) : oddArr.push(numArr[i]); } for(var x=0;x<evenArr.length;x++){ evenArr[x]>9 ? sum+=(evenArr[x]-9) : sum+=evenArr[x]; } for(var k=0;k<oddArr.length;k++){ sum+=parseInt(oddArr[k]); } return (sum%10 == 0); }
1.4优缺点
Luhn算法可以检测出任何单码错误和近乎所有的相邻数字交换产生的错误,但是检测不出两个数字序列09和90的交换错误。它可以检测出十分之七比例的相同两位数交换错误(但2↔55,33↔66和44↔77除外)。