首先我们来了解下,什么是Luhn算法
Luhn算法也被成为“模10算法”。
他是一种简单的校验公式,一般会被用于银行卡,身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证。该算法是由IBM的科学家Hans Peter Luhn 所创造,于1954年1月6号提出该专利的申请。
校验码获取方式
以数字622789300915为例
1,将待计算的校验码X补充到该数字末尾,622789300915X
2,从右往左,偶数位置(即加粗数字)数字乘2 得:6421481830018110X
3,将偶数位置2位数的数值相加替换原来位置得:642589300911X
4,将奇偶位置数字相加(不管X)得:48
5,48模10得8,再用10减去8得2,最后一位校验码即为2
6,通过以上数据得到校验码后,追加到原数字622789300915末尾,最后号码为:6227893009152
校验码验证方式
知道校验码的获取方式后,反之推理我们便可根据相关号码的最后一位校验码来判断号码是否有效
还是以上面的数字为例:6227893009152
1,从右往左,偶数位置(即加粗数字)数字乘2 得:64214818300181102
2,将偶数位置2位数的数值相加替换原来位置得:6425893009112
3,将奇偶位置数字相加得:50
4,将所得数字和模10得0即为有效数字
知道原理以及校验原理后,接下来要做的事情就比较明确了
将上述校验方式转为JS方法
Js校验方法
1,基础检查,号码是否全数字,长度以及前两位是否符合规则
function luhmCheck(bankno){ //检查是否是全数字,号码长度是否在16-19位
if (!/^\d{16,19}$/.test(bankno)) {
return false
} //检查银行卡前两位是否符合规范
let strBin="10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99";
if (strBin.indexOf(bankno.substring(0, 2))== -1) {
return false;
}
return true
}
2,校验Luhn算法
function checkLuhnCode(bankno){
let lastNum=bankno.substr(bankno.length-1,1)//取出最后一位
let beforeNum=bankno.substr(0,bankno.length-1)//前15或18位
let numberArr=[]
let sum=0
for(let i=0;i<bankno.length;i++){ //偶数位乘2并将偶数位乘得的2位数相加
let num = bankno.substr(i,1)
num = i%2 ==1 ? num*2 : num
num = addNum(num)
sum += num*1//将奇偶位置数字相加
numberArr.push(num)
}
//模10判断
return sum%10==0
}
//处理两位数字返回个十位相加
function addNum(num){ let str = num.toString()
return num >=10 ? parseInt(str.substr(0,1))+parseInt(str.substr(1,1)) : num
}
//校验上面号码
checkLuhnCode('6227893009152')//true
//更改最后一位校验码
checkLuhnCode('6227893009153')//false