go語言實現(xiàn)銀行卡號Luhn校驗
一、銀行卡號碼的校驗規(guī)則
銀行卡號碼的校驗采用Luhn算法,校驗過程大致如下:
1. 從右到左給卡號字符串編號,最右邊第一位是1,最右邊第二位是2,最右邊第三位是3….
2. 從右向左遍歷,對每一位字符t執(zhí)行第三個步驟,并將每一位的計算結(jié)果相加得到一個數(shù)s。
3. 對每一位的計算規(guī)則:如果這一位是奇數(shù)位,則返回t本身,如果是偶數(shù)位,則先將t乘以2得到一個數(shù)n,如果n是一位數(shù)(小于10),直接返回n,否則將n的個位數(shù)和十位數(shù)相加返回。
4. 如果s能夠整除10,則此號碼有效,否則號碼無效。
因為最終的結(jié)果會對10取余來判斷是否能夠整除10,所以又叫做模10算法。
二、生成符合Luhn規(guī)則的銀行卡號測試數(shù)據(jù)
前面既然摸清了銀行卡號的校驗規(guī)則,那么就可以根據(jù)此規(guī)則生成一些能夠通過Luhn校驗的測試數(shù)據(jù)。
思路:
因為最右邊的一位是奇數(shù)位,奇數(shù)位不需要改變值直接放啥就是啥,這個特性很重要,正好可以用來補齊到正好能夠整除10。
所以顯然能夠推測出生成n位符合Luhn規(guī)則的算法:
1. 隨機生成n-1位字符,稱為字符串x。
2. 先假設(shè)字符串x有n位(實際上最右邊一位缺失是n-1位,最后一位用0補上占位置),將x按照n位長度計算和s,
3. 上一步得到字符串x的校驗和s,將s加上一個數(shù)字y,使得它正好可以整除10,這個y就是最右邊第一位應(yīng)該放的數(shù)字。
4. x+y做字符串拼接運算,得到最終的n位符合Luhn規(guī)則的字符串。
整個代碼如下:
package main import ( "fmt" "math/rand" "strconv" "time" ) func main() { fmt.Println(checkCarNum("6226095711989751")) cardNum := genCardNum("622609", 16) fmt.Println(cardNum) fmt.Println(checkCarNum(cardNum)) } func checkCarNum(cardNum string) bool { sum, err := getCardNumSum(cardNum) if err != nil { return false } return sum%10 == 0 } func getCardNumSum(cardNum string) (int64, error) { sum := int64(0) length := len(cardNum) index := length - 1 for { t, err := strconv.ParseInt(string(cardNum[index]), 10, 64) if err != nil { return 0, err } if index%2 == 0 { t = t * 2 if t >= 10 { t = t%10 + t/10 } } sum += t if index <= 0 { break } index-- } return sum, nil } func genCardNum(startWith string, totalNum int) string { result := startWith length := len(result) rand.New(rand.NewSource(time.Now().UnixNano())) for { result += fmt.Sprintf("%d", rand.Intn(10)) if length == totalNum-1 { break } length++ } sum, _ := getCardNumSum(result + "0") t := 10 - sum%10 if t == 10 { t = 0 } result += fmt.Sprintf("%d", t) return result }
以上就是go語言實現(xiàn)銀行卡Luhn校驗的詳細內(nèi)容,更多關(guān)于go銀行卡Luhn校驗的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Hugo?Config模塊構(gòu)建實現(xiàn)源碼剖析
這篇文章主要為大家介紹了Hugo?Config模塊構(gòu)建實現(xiàn)源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02GoLang jwt無感刷新與SSO單點登錄限制解除方法詳解
這篇文章主要介紹了GoLang jwt無感刷新與SSO單點登錄限制解除方法,JWT是一個簽名的JSON對象,通常用作Oauth2的Bearer token,JWT包括三個用.分割的部分。本文將利用JWT進行認證和加密,感興趣的可以了解一下2023-03-03golang 實現(xiàn)tcp server端和client端,并計算RTT時間操作
這篇文章主要介紹了golang 實現(xiàn)tcp server端和client端,并計算RTT時間操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Go語言標(biāo)準(zhǔn)庫之strconv的使用
本文主要介紹了Go語言標(biāo)準(zhǔn)庫之strconv的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03