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校驗的詳細(xì)內(nèi)容,更多關(guān)于go銀行卡Luhn校驗的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門
這篇文章主要為大家介紹了golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
go語言LeetCode題解999可以被一步捕獲的棋子數(shù)
這篇文章主要為大家介紹了go語言LeetCode題解999可以被一步捕獲的棋子數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Go使用TimerController解決timer過多的問題
多路復(fù)用,實際上Go底層也是一種多路復(fù)用的思想去實現(xiàn)的timer,但是它是底層的timer,我們需要解決的問題就過多的timer問題!本文給大家介紹了Go使用TimerController解決timer過多的問題,需要的朋友可以參考下2024-12-12
go語言使用第三方包 json化結(jié)構(gòu)體操作示例
這篇文章主要介紹了go語言使用第三方包 json化結(jié)構(gòu)體操作,結(jié)合實例形式分析了Go語言ffjson包git安裝及結(jié)構(gòu)體轉(zhuǎn)json字符串相關(guān)操作技巧,需要的朋友可以參考下2019-06-06

