算法:Luhn算法

背景

绑卡签约/支付时,想对用户输入的银行卡卡号做个简单的校验,以防止用户粗心输入错误的银行卡卡号。

算法介绍

Luhn校验数字算法(Luhn Check Digit Algorithm),也被称作“模10算法”,是一种简单的校验公式。一般会被用于身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证,这些数字串的特点是:最后一位为校验码。

算法规则

在看算法前,可以先了解一下银行卡号编码规则,内容较多,这里不讲。

需要重点提醒的是:

  • 大部分的银行卡卡号都遵循 Luhn 规则,但是也有少量不符合的。
  • 所以 Luhn 只能告诉你“这个卡号可能是错误的,它不符合Luhn规则”,但是不能保证“这个卡号一定是错误的”。
  • Luhn 只做校验,不管安全:校验的目的是防止意外操作导致的错误,如输错银行卡号等;但如果是恶意攻击什么的,Luhn无能为力。

Luhn 通过如下规则计算校验码的正确性:

  1. 从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,将结果减去9。
  2. 把所有数字相加,得到总和。
  3. 如果卡号码是合法的,总和可以被10整除。

代码实现

// 如果没有卡号全数字的前置校验,需处理 String 转 Integer 异常
public boolean luhn(String cardNo){

    int sum = 0;

    // 从右向左数,奇数位数字,相加
    for(int i = cardNo.length()-1 ; i>=0 ; i-=2){
        sum += Integer.valueOf(String.valueOf(cardNo.charAt(i)));
    }

    // 从右向左数,偶数位数字*2%9,相加
    for(int i = cardNo.length()-2 ; i>=0 ; i-=2){
        sum += (Integer.valueOf(String.valueOf(cardNo.charAt(i))) * 2) % 9;
    }

    // 加和取余10
    return 0 == sum % 10;
}

Luhn 算法维基百科:https://en.wikipedia.org/wiki/Luhn_algorithm#cite_note-0

你可能感兴趣的:(算法:Luhn算法)