基于Luhn算法的銀行卡卡號的格式校驗(yàn)

引言


在金融類軟件開發(fā)過程中薇溃,經(jīng)常會涉及到用戶銀行卡信息的校驗(yàn),包括銀行卡卡號缭乘、開戶人姓名痊焊、身份證號和手機(jī)號等。理想狀況下忿峻,當(dāng)然希望能夠?qū)⑦@些信息傳遞給服務(wù)器薄啥,然后服務(wù)器通過銀行或其他機(jī)構(gòu)提供的API進(jìn)行匹配性的驗(yàn)證。但是逛尚,如果服務(wù)器沒有這些可供驗(yàn)證的API垄惧,就只能在APP端進(jìn)行一個(gè)格式上的校驗(yàn)了。

身份證號可以用16位或18位的數(shù)字和字母組成的正則表達(dá)式驗(yàn)證格式绰寞,手機(jī)號可以用11位的數(shù)字驗(yàn)證到逊,而對于銀行卡卡號就相對比較麻煩了,涉及到下面闡述的Luhn算法規(guī)則滤钱。

Luhn簡介


Luhn算法/公式觉壶,也稱“模10算法”,是一種簡單的校驗(yàn)公式件缸,常被用于銀行卡卡號铜靶、IMEI號等證件號碼的識別校驗(yàn)。Luhn算法是由IBM的一位科學(xué)家所創(chuàng)他炊,之后被ISO指定争剿,成為大家公認(rèn)的一項(xiàng)標(biāo)準(zhǔn)。

注意一點(diǎn)痊末,Luhn算法存在的目的并不是成為一種加密安全的哈希函數(shù)蚕苇。它的目的在于防止意外操作導(dǎo)致的錯(cuò)誤,如錯(cuò)誤輸入凿叠,而不是惡意攻擊涩笤。很多銀行卡卡號和政府證件號碼將該算法作為一種簡單的方式用于從鍵盤錯(cuò)誤錄入或其他錯(cuò)誤號碼中分辨有效數(shù)字。

校驗(yàn)規(guī)則


Luhn算法被用于最后一位為校驗(yàn)碼的一串?dāng)?shù)字的校驗(yàn)盒件,通過如下規(guī)則計(jì)算校驗(yàn)碼的正確性:

  1. 按照從右往左的順序蹬碧,從這串?dāng)?shù)字的右邊開始,包含校驗(yàn)碼履恩,將偶數(shù)位數(shù)字乘以2锰茉,如果每次乘二操作的結(jié)果大于9(如 8 × 2 = 16),然后計(jì)算個(gè)位和十位數(shù)字的和(如 1 + 6 = 7)或者用這個(gè)結(jié)果減去9(如 16 - 9 = 7)切心;

  2. 第一步操作過后會得到新的一串?dāng)?shù)字飒筑,計(jì)算所有數(shù)字的和(包含校驗(yàn)碼)片吊;

  3. 用第二步操作得到的和進(jìn)行“模10”運(yùn)算,如果結(jié)果位0协屡,表示校驗(yàn)通過俏脊,否則失敗。

下面肤晓,我們通過具體的例子來說明上述規(guī)則爷贫,給定一串?dāng)?shù)字:7992739871x,注意补憾,末尾的x表示校驗(yàn)碼漫萄,按照上面的規(guī)則進(jìn)行計(jì)算,如圖:

按照規(guī)則計(jì)算新數(shù)字串中各位數(shù)字的和:67+x 盈匾,并進(jìn)行“模10”運(yùn)算:(67+x) mod 10 腾务,只有滿足結(jié)果為0的x值才是正確的校驗(yàn)碼。通過如下計(jì)算可以得到x的值:

  1. 計(jì)算不包含校驗(yàn)碼的所有數(shù)字的和(67)削饵;

  2. 乘以9(603)岩瘦;

  3. 最后一位數(shù)字,3窿撬,就是檢驗(yàn)碼启昧,即,x = 3 劈伴。

當(dāng)然密末,你也可以選擇別的計(jì)算方式,或者口算就能得到x為3宰啦,畢竟目的只有一個(gè)苏遥, 路可以有很多條。諸如其他的值赡模,x為{1,2师抄,4漓柑,5,6叨吮,7辆布,8,9茶鉴,0}锋玲,都是錯(cuò)誤的,均不滿足Luhn算法的要求涵叮。

優(yōu)缺點(diǎn)


Luhn算法可以檢測出任何單碼錯(cuò)誤和近乎所有的相鄰數(shù)字交換產(chǎn)生的錯(cuò)誤惭蹂,但是檢測不出兩個(gè)數(shù)字序列09和90的交換錯(cuò)誤伞插。它可以檢測出十分之七比例的相同兩位數(shù)交換錯(cuò)誤(但2 ? 55, 33 ? 66 和 44 ? 77除外)。

Java實(shí)現(xiàn)


通過上面算法介紹和規(guī)則說明盾碗,大家應(yīng)該能夠利用自己所擅長的語言實(shí)現(xiàn)對銀行卡卡號格式的校驗(yàn)了媚污,比如Java語言下的校驗(yàn)實(shí)現(xiàn)代碼為:

    /**
     * 匹配Luhn算法:可用于檢測銀行卡卡號
     * @param cardNo
     * @return
     */
    public static boolean matchLuhn(String cardNo) {
        int[] cardNoArr = new int[cardNo.length()];
        for (int i=0; i<cardNo.length(); i++) {
            cardNoArr[i] = Integer.valueOf(String.valueOf(cardNo.charAt(i)));
        }
        for(int i=cardNoArr.length-2;i>=0;i-=2) {
            cardNoArr[i] <<= 1;
            cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10;
        }
        int sum = 0;
        for(int i=0;i<cardNoArr.length;i++) {
            sum += cardNoArr[i];
        }
        return sum % 10 == 0;
    }

利用Luhn算法的規(guī)則也可以寫出隨機(jī)生成一個(gè)滿足條件的銀行卡卡號的實(shí)現(xiàn)代碼。

Luhn算法英文參考:
https://en.wikipedia.org/wiki/Luhn_algorithm#cite_note-0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廷雅,一起剝皮案震驚了整個(gè)濱河市耗美,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌航缀,老刑警劉巖商架,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芥玉,居然都是意外死亡蛇摸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門飞傀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皇型,“玉大人,你說我怎么就攤上這事砸烦∑唬” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵幢痘,是天一觀的道長唬格。 經(jīng)常有香客問我,道長颜说,這世上最難降的妖魔是什么购岗? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮门粪,結(jié)果婚禮上喊积,老公的妹妹穿的比我還像新娘。我一直安慰自己玄妈,他們只是感情好乾吻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拟蜻,像睡著了一般绎签。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酝锅,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天诡必,我揣著相機(jī)與錄音,去河邊找鬼搔扁。 笑死爸舒,一個(gè)胖子當(dāng)著我的面吹牛蟋字,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碳抄,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼愉老,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剖效?” 一聲冷哼從身側(cè)響起嫉入,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璧尸,沒想到半個(gè)月后咒林,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爷光,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年垫竞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛀序。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欢瞪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徐裸,到底是詐尸還是另有隱情遣鼓,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布重贺,位于F島的核電站骑祟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏气笙。R本人自食惡果不足惜次企,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望潜圃。 院中可真熱鬧缸棵,春花似錦、人聲如沸谭期。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崇堵。三九已至,卻和暖如春客燕,著一層夾襖步出監(jiān)牢的瞬間鸳劳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工也搓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏廓,地道東北人涵紊。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像幔摸,于是被迫代替她去往敵國和親摸柄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容