最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言實(shí)現(xiàn)銀行卡號Luhn校驗

 更新時間:2022年05月19日 12:41:34   作者:dz45693  
這篇文章主要為大家介紹了go語言Luhn校驗測試銀行卡號碼的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、銀行卡號碼的校驗規(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ù)位不需要改變值直接放啥就是啥,這個特性很重要,正好可以用來補(bǔ)齊到正好能夠整除10。

所以顯然能夠推測出生成n位符合Luhn規(guī)則的算法:

1. 隨機(jī)生成n-1位字符,稱為字符串x。

2. 先假設(shè)字符串x有n位(實(shí)際上最右邊一位缺失是n-1位,最后一位用0補(bǔ)上占位置),將x按照n位長度計算和s,

3. 上一步得到字符串x的校驗和s,將s加上一個數(shù)字y,使得它正好可以整除10,這個y就是最右邊第一位應(yīng)該放的數(shù)字。

4. x+y做字符串拼接運(yùn)算,得到最終的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
}

參考:銀行卡號碼校驗算法(Luhn算法,又叫模10算法) 

以上就是go語言實(shí)現(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ā)框架使用快速入門

    這篇文章主要為大家介紹了golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 減少 golang 二進(jìn)制文件大小操作

    減少 golang 二進(jìn)制文件大小操作

    這篇文章主要介紹了減少 golang 二進(jìn)制文件大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go語言LeetCode題解999可以被一步捕獲的棋子數(shù)

    go語言LeetCode題解999可以被一步捕獲的棋子數(shù)

    這篇文章主要為大家介紹了go語言LeetCode題解999可以被一步捕獲的棋子數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go使用TimerController解決timer過多的問題

    Go使用TimerController解決timer過多的問題

    多路復(fù)用,實(shí)際上Go底層也是一種多路復(fù)用的思想去實(shí)現(xiàn)的timer,但是它是底層的timer,我們需要解決的問題就過多的timer問題!本文給大家介紹了Go使用TimerController解決timer過多的問題,需要的朋友可以參考下
    2024-12-12
  • go語言使用第三方包 json化結(jié)構(gòu)體操作示例

    go語言使用第三方包 json化結(jié)構(gòu)體操作示例

    這篇文章主要介紹了go語言使用第三方包 json化結(jié)構(gòu)體操作,結(jié)合實(shí)例形式分析了Go語言ffjson包git安裝及結(jié)構(gòu)體轉(zhuǎn)json字符串相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • 淺析Go語言中閉包的使用

    淺析Go語言中閉包的使用

    閉包是一個函數(shù)和其相關(guān)的引用環(huán)境組合的一個整體。本文主要為大家介紹一下Go語言中閉包的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-12-12
  • Golang解析yaml文件操作指南

    Golang解析yaml文件操作指南

    之前一直從事java開發(fā),習(xí)慣了使用yaml文件的格式,尤其是清晰的層次結(jié)構(gòu)、注釋,下面這篇文章主要給大家介紹了關(guān)于Golang解析yaml文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Golang中map的三種聲明定義方式實(shí)現(xiàn)

    Golang中map的三種聲明定義方式實(shí)現(xiàn)

    本文主要介紹了Golang中map的三種聲明定義方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Golang使用Token來驗證

    Golang使用Token來驗證

    token指的是一種用于驗證用戶身份或授權(quán)訪問的憑證,本文主要介紹了Golang使用Token來驗證,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Go語言定時器Timer和Ticker的使用與區(qū)別

    Go語言定時器Timer和Ticker的使用與區(qū)別

    在Go語言中內(nèi)置的有兩個定時器,Timer和Ticker,本文主要介紹了Go語言定時器Timer和Ticker的使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07

最新評論

阿合奇县| 山丹县| 寻乌县| 乌兰察布市| 嫩江县| 湖南省| 高邑县| 平江县| 赤水市| 吐鲁番市| 阿瓦提县| 右玉县| 遂宁市| 昭平县| 湖南省| 六安市| 乐都县| 岢岚县| 冷水江市| 池州市| 禄丰县| 永康市| 华容县| 长岛县| 迭部县| 射洪县| 长顺县| 建昌县| 顺昌县| 会泽县| 磐石市| 四会市| 郓城县| 广灵县| 闽侯县| 泰兴市| 忻州市| 通江县| 波密县| 泰顺县| 项城市|