網站首頁 編程語言 正文
一、銀行卡號碼的校驗規則
銀行卡號碼的校驗采用Luhn算法,校驗過程大致如下:
1. 從右到左給卡號字符串編號,最右邊第一位是1,最右邊第二位是2,最右邊第三位是3….
2. 從右向左遍歷,對每一位字符t執行第三個步驟,并將每一位的計算結果相加得到一個數s。
3. 對每一位的計算規則:如果這一位是奇數位,則返回t本身,如果是偶數位,則先將t乘以2得到一個數n,如果n是一位數(小于10),直接返回n,否則將n的個位數和十位數相加返回。
4. 如果s能夠整除10,則此號碼有效,否則號碼無效。
因為最終的結果會對10取余來判斷是否能夠整除10,所以又叫做模10算法。
二、生成符合Luhn規則的銀行卡號測試數據
前面既然摸清了銀行卡號的校驗規則,那么就可以根據此規則生成一些能夠通過Luhn校驗的測試數據。
思路:
因為最右邊的一位是奇數位,奇數位不需要改變值直接放啥就是啥,這個特性很重要,正好可以用來補齊到正好能夠整除10。
所以顯然能夠推測出生成n位符合Luhn規則的算法:
1. 隨機生成n-1位字符,稱為字符串x。
2. 先假設字符串x有n位(實際上最右邊一位缺失是n-1位,最后一位用0補上占位置),將x按照n位長度計算和s,
3. 上一步得到字符串x的校驗和s,將s加上一個數字y,使得它正好可以整除10,這個y就是最右邊第一位應該放的數字。
4. x+y做字符串拼接運算,得到最終的n位符合Luhn規則的字符串。
整個代碼如下:
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 }
參考:銀行卡號碼校驗算法(Luhn算法,又叫模10算法)?
原文鏈接:https://blog.csdn.net/ma_jiang/article/details/124294450
相關推薦
- 2023-08-16 uniapp頁面返回到上一個頁面,更新其數據
- 2022-06-29 python密碼學庫pynacl功能介紹_python
- 2022-06-07 Python利用capstone實現反匯編_python
- 2023-07-09 時間模式更改為:“剛剛“,“分鐘前“,“小時前“
- 2022-11-22 Redis?BloomFilter布隆過濾器原理與實現_Golang
- 2022-09-08 Python?避免字典和元組的多重嵌套問題_python
- 2022-05-29 Python格式化字符串的案例方法_python
- 2023-12-23 css設置文字超出顯示...
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支