溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于Luhn算法的銀行卡校驗(yàn)規(guī)則是什么

發(fā)布時(shí)間:2022-05-19 15:01:45 來(lái)源:億速云 閱讀:207 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“基于Luhn算法的銀行卡校驗(yàn)規(guī)則是什么”,在日常操作中,相信很多人在基于Luhn算法的銀行卡校驗(yàn)規(guī)則是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”基于Luhn算法的銀行卡校驗(yàn)規(guī)則是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

案例:

當(dāng)你輸入信用卡號(hào)碼的時(shí)候,有沒(méi)有擔(dān)心輸錯(cuò)了而造成損失呢?其實(shí)可以不必這么擔(dān)心,因?yàn)椴⒉皇且粋€(gè)隨便的信用卡號(hào)碼都是合法的,它必須通過(guò)Luhn算法來(lái)驗(yàn)證通過(guò)。

該校驗(yàn)的過(guò)程:

1、從卡號(hào)最后一位數(shù)字開(kāi)始,逆向?qū)⑵鏀?shù)位(1、3、5等等)相加。

2、從卡號(hào)最后一位數(shù)字開(kāi)始,逆向?qū)⑴紨?shù)位數(shù)字,先乘以2(如果乘積為兩位數(shù),則將其減去9),再求和。

3、將奇數(shù)位總和加上偶數(shù)位總和,結(jié)果應(yīng)該可以被10整除。

例如,卡號(hào)是:5432123456788881

則奇數(shù)、偶數(shù)位(用紅色標(biāo)出)分布:5432123456788881

奇數(shù)位和=35

偶數(shù)位乘以2(有些要減去9)的結(jié)果:16 2 6 1 5 7 7,求和=35。

最后35+35=70可以被10整除,認(rèn)定校驗(yàn)通過(guò)。

import java.util.Scanner;
//信用卡號(hào)校驗(yàn)算法
public class Luhn {
 public static void main(String[] args) {
  System.out.println("Please input your credit card number:");
  Scanner input = new Scanner(System.in);
  int sumOdd = 0;
  int sumEven = 0;
  String number = input.next();
  int length = number.length();
  int[] wei = new int[length];
  for (int i = 0; i < number.length(); i++) {
   wei[i] = Integer.parseInt(number.substring(length - i - 1, length
     - i));// 從最末一位開(kāi)始提取,每一位上的數(shù)值
   System.out.println("第" + i + "位數(shù)字是:" + wei[i]);
  }
  for (int i = 0; i < length / 2; i++) {
   sumOdd += wei[2 * i];
   if ((wei[2 * i + 1] * 2) > 9)
    wei[2 * i + 1] = wei[2 * i + 1] * 2 - 9;
   else
    wei[2 * i + 1] *= 2;
   sumEven += wei[2 * i + 1];
  }
  System.out.println("奇數(shù)位的和是:" + sumOdd);
  System.out.println("偶數(shù)位的和是:" + sumEven);
  if ((sumOdd + sumEven) % 10 == 0)
   System.out.println("Recept.");
  else
   System.out.println("Can not recept.");
 }
}

運(yùn)行結(jié)果:

Please input your credit card number:
5432123456788881
第0位數(shù)字是:1
第1位數(shù)字是:8
第2位數(shù)字是:8
第3位數(shù)字是:8
第4位數(shù)字是:8
第5位數(shù)字是:7
第6位數(shù)字是:6
第7位數(shù)字是:5
第8位數(shù)字是:4
第9位數(shù)字是:3
第10位數(shù)字是:2
第11位數(shù)字是:1
第12位數(shù)字是:2
第13位數(shù)字是:3
第14位數(shù)字是:4
第15位數(shù)字是:5
奇數(shù)位的和是:35
偶數(shù)位的和是:35
Recept.

銀行卡校驗(yàn)規(guī)則(Luhn算法)

Luhn檢驗(yàn)數(shù)字算法(Luhn Check Digit Algorithm),也叫做模數(shù)10公式,是一種簡(jiǎn)單的算法,用于驗(yàn)證銀行卡、信用卡號(hào)碼的有效性的算法。對(duì)所有大型信用卡公司發(fā)行的信用卡都起作用,這些公司包括美國(guó)Express、護(hù)照、萬(wàn)事達(dá)卡、Discover和用餐者俱樂(lè)部等。這種算法最初是在20世紀(jì)60年代由一組數(shù)學(xué)家制定,現(xiàn)在Luhn檢驗(yàn)數(shù)字算法屬于大眾,任何人都可以使用它。

算法:將每個(gè)奇數(shù)加倍和使它變?yōu)閱蝹€(gè)的數(shù)字,如果必要的話通過(guò)減去9和在每個(gè)偶數(shù)上加上這些值。如果此卡要有效,那么,結(jié)果必須是10的倍數(shù)。

比如上圖的卡號(hào)為3759 8765 4321 001 (15位),從最高位開(kāi)始所有的奇數(shù)位相加,偶數(shù)為乘以2相加(偶數(shù)乘以2后如果大于10則兩位數(shù)相加),把這些奇數(shù)和偶數(shù)都加在一起得到57.

(57+3)%10 ==0 如果此卡滿足被10整除,則有效位必定為3。

針對(duì)目前提現(xiàn)成功(clear_success)的記錄里面,統(tǒng)計(jì)卡號(hào)的位數(shù)和數(shù)量關(guān)系如下:

卡號(hào)位數(shù)數(shù)量

<13        3038+

14           538

15           476

16           10884

17           68

18           4395

19          38070

>20        504+

說(shuō)明:

位數(shù)少于14的卡號(hào)基本是外資銀行,或小銀行。

位數(shù)少于14的卡號(hào)基本是外資銀行,或小銀行。

***496748***        **     HSBC                               HSBCHKHHHKH  

***430259***        **     HSBC                               HSBCHKHHHKH  

***51878018***     **    Bank of East Asia Limited      BEASHKHHXXX   

位數(shù)多于23的卡號(hào)大多是卡號(hào)包含字母或空格。

62270014 **** 0045 ***      CHINA CONSTRUCTION BANK **                

601382700 **** 9077 **      BANK OF CHINA FOSHAN BRANCH **

如果是國(guó)內(nèi)的主流銀行(中、農(nóng)、工、建、招、交等)基本都是基于16位或者19位的卡號(hào)。

來(lái)看看提現(xiàn)成功(clear_success)里面的卡有多少滿足Luhn規(guī)則

針對(duì)16位美元個(gè)人用戶  準(zhǔn)確率:99.84%

正確的卡號(hào)數(shù)量:3105    不正確的卡號(hào)數(shù)量 :14

卡號(hào)45806509689007** is NOT valid

卡號(hào)48620375555016** is NOT valid

卡號(hào)54202100231152** is NOT valid

卡號(hào)58890201075786** is NOT valid

卡號(hào)62106200000456** is NOT valid

卡號(hào)62129986037235** is NOT valid

卡號(hào)62252017026526** is NOT valid

針對(duì)19位美元個(gè)人用戶   準(zhǔn)確率:99.96%

正確的卡號(hào)數(shù)量:10574       不正確的卡號(hào)數(shù)量 :13  其中3筆發(fā)生退票

卡號(hào)60138214000567721** is NOT valid

卡號(hào)60138217000662109** is NOT valid

卡號(hào)60138220005824282** is NOT valid

卡號(hào)60138220006014219** is NOT valid

卡號(hào)60220001386050410** is NOT valid

卡號(hào)62161132000004484** is NOT valid

卡號(hào)62220212082154900** is NOT valid

卡號(hào)62220836020035821** is NOT valid

卡號(hào)63214140980000000** is NOT valid

以上都是提現(xiàn)成功的卡號(hào),可以看到基本都嚴(yán)格滿足Luhn算法。

卡號(hào)位數(shù)數(shù)量

15      1

16      149

17      4

18      64

19      502

20      3

正確的卡號(hào)數(shù)量:622

不正確的卡號(hào)數(shù)量:29 + 1 +4+64+3

14%卡填寫(xiě)違法了Luhn算法,也就是這部分卡號(hào)都是可以提前通過(guò)Luhn校驗(yàn)發(fā)現(xiàn)的。

結(jié)論是我們可以在填寫(xiě)收款賬戶的時(shí)候,添加一種Luth算法的JS腳本檢查用戶填寫(xiě)的卡號(hào)存在問(wèn)題。當(dāng)然即時(shí)用戶填寫(xiě)的卡號(hào)違法了該規(guī)則,我們?nèi)匀贿\(yùn)行用戶填寫(xiě),但給出相應(yīng)的警示內(nèi)容(可能填錯(cuò))。

目前在收銀臺(tái)頁(yè)面(Checkout.vm)針對(duì)信用卡的交易,校驗(yàn)的JS :isValidCardfunction函數(shù)就包含了Luth校驗(yàn)規(guī)則,必須嚴(yán)格按照該規(guī)則的卡才能提交表單。

到此,關(guān)于“基于Luhn算法的銀行卡校驗(yàn)規(guī)則是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI