溫馨提示×

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

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

銀行卡號(hào)碼的校驗(yàn)規(guī)則(Luhn算法/模10算法)

發(fā)布時(shí)間:2020-08-10 12:58:28 來源:網(wǎng)絡(luò) 閱讀:1428 作者:jedi911 欄目:開發(fā)技術(shù)

銀行卡校驗(yàn)

可以用于前端需要用戶輸入銀行卡時(shí)做初步校驗(yàn)

銀行卡號(hào)碼的校驗(yàn)采用Luhn算法,校驗(yàn)過程大致如下:

  1. 從右到左給卡號(hào)字符串編號(hào),最右邊第一位是1,最右邊第二位是2,最右邊第三位是3….

  2. 從右向左遍歷,對(duì)每一位字符t執(zhí)行第三個(gè)步驟,并將每一位的計(jì)算結(jié)果相加得到一個(gè)數(shù)s。

  3. 對(duì)每一位的計(jì)算規(guī)則:如果這一位是奇數(shù)位,則返回t本身,如果是偶數(shù)位,則先將t乘以2得到一個(gè)數(shù)n,如果n是一位數(shù)(小于10),直接返回n,否則將n的個(gè)位數(shù)和十位數(shù)相加返回。

  4. 如果s能夠整除10,則此號(hào)碼有效,否則號(hào)碼無(wú)效。

因?yàn)樽罱K的結(jié)果會(huì)對(duì)10取余來判斷是否能夠整除10,所以又叫做模10算法。

% 取模 - 返回除法的余數(shù)
*= 乘法賦值運(yùn)算符 c = a 等效于 c = c a
// 取整除 - 返回商的整數(shù)部分(向下取整)

使用Python實(shí)現(xiàn)

def luhn(card_num):
    s = 0
    card_num_length = len(card_num)
    for _ in range(1, card_num_length + 1):
        t = int(card_num[card_num_length - _])
        print("當(dāng)前銀行卡對(duì)應(yīng)數(shù)字t={}".format(t))
        print("當(dāng)前_為{}".format(_))
        print("_取模{}".format(_ % 2))
        if _ % 2 == 0:
            print("當(dāng)前是偶數(shù)位")
            t *= 2
            print("t={}".format(t))
            s += t if t < 10 else t % 10 + t // 10

        else:
            print("當(dāng)前為奇數(shù)位")
            s += t
        print("s={}".format(s))
    return s % 10 == 0

if __name__ == '__main__':
    print(luhn('6226095711989751'))

執(zhí)行結(jié)果:

當(dāng)前銀行卡對(duì)應(yīng)數(shù)字t=1
當(dāng)前_為1
_取模1
當(dāng)前為奇數(shù)位
s=1

當(dāng)前銀行卡對(duì)應(yīng)數(shù)字t=5
當(dāng)前_為2
_取模0
當(dāng)前是偶數(shù)位
t=10
s=2

......

當(dāng)前銀行卡對(duì)應(yīng)數(shù)字t=6
當(dāng)前_為16
_取模0
當(dāng)前是偶數(shù)位
t=12
s=70

True

參考來源:
https://www.cnblogs.com/cc11001100/p/9357177.html

百度百科介紹Luhn算法

我們以數(shù)字“7992739871”為例,計(jì)算其校驗(yàn)位:
從校驗(yàn)位開始,從右往左,偶數(shù)位乘2(例如,7*2=14),然后將兩位數(shù)字的個(gè)位與十位相加(例如,10:1+0=1,14:1+4=5);
把得到的數(shù)字加在一起(本例中得到67);
將數(shù)字的和取模10(本例中得到7),再用10去減(本例中得到3),得到校驗(yàn)位。
Python實(shí)現(xiàn)

def checkLuhn(purportedCC=''):
    sum_ = 0
    parity = len(purportedCC) % 2
    for i, digit in enumerate([int(x) for x in purportedCC]):
        if i % 2 == parity:
            digit *= 2
            if digit > 9:
                digit -= 9
        sum_ += digit
    return sum_ % 10 == 0
向AI問一下細(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