背景
綁卡簽約/支付時,想對用戶輸入的銀行卡卡號做個簡單的校驗奉狈,以防止用戶粗心輸入錯誤的銀行卡卡號。
算法介紹
Luhn校驗數(shù)字算法(Luhn Check Digit Algorithm)桑驱,也被稱作“模10算法”跛蛋,是一種簡單的校驗公式。一般會被用于身份證號碼押框,IMEI號碼理逊,美國供應(yīng)商識別號碼盒揉,或是加拿大的社會保險號碼的驗證刚盈,這些數(shù)字串的特點是:最后一位為校驗碼藕漱。
算法規(guī)則
在看算法前崭闲,可以先了解一下銀行卡號編碼規(guī)則,內(nèi)容較多橄仍,這里不講薄翅。
需要重點提醒的是:
- 大部分的銀行卡卡號都遵循 Luhn 規(guī)則,但是也有少量不符合的鼎天。
- 所以 Luhn 只能告訴你“這個卡號可能是錯誤的暑竟,它不符合Luhn規(guī)則”,但是不能保證“這個卡號一定是錯誤的”罗岖。
- Luhn 只做校驗腹躁,不管安全:校驗的目的是防止意外操作導(dǎo)致的錯誤,如輸錯銀行卡號等纺非;但如果是惡意攻擊什么的烧颖,Luhn無能為力。
Luhn 通過如下規(guī)則計算校驗碼的正確性:
- 從卡號最后一位數(shù)字開始炕淮,偶數(shù)位乘以2,如果乘以2的結(jié)果是兩位數(shù)币叹,將結(jié)果減去9套硼。
- 把所有數(shù)字相加卡辰,得到總和。
- 如果卡號碼是合法的反砌,總和可以被10整除宴树。
代碼實現(xiàn)
// 如果沒有卡號全數(shù)字的前置校驗晶疼,需處理 String 轉(zhuǎn) Integer 異常
public boolean luhn(String cardNo){
int sum = 0;
// 從右向左數(shù),奇數(shù)位數(shù)字锭吨,相加
for(int i = cardNo.length()-1 ; i>=0 ; i-=2){
sum += Integer.valueOf(String.valueOf(cardNo.charAt(i)));
}
// 從右向左數(shù)零如,偶數(shù)位數(shù)字*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