Skip to content

Commit

Permalink
add random idcar generator
Browse files Browse the repository at this point in the history
  • Loading branch information
bluesky335 committed Apr 25, 2022
1 parent 46e73d3 commit 6e7882a
Show file tree
Hide file tree
Showing 5 changed files with 3,288 additions and 33 deletions.
33 changes: 18 additions & 15 deletions IDNumber/IDNumber.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,21 @@ func New(number string) IDNumber {
// 检查是否符合身份证国标
// 计算规则参考“中国国家标准化管理委员会”官方文档:http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E
func (id IDNumber) IsValid() bool {
var idStr = strings.ToUpper(string(id))
var reg, err = regexp.Compile(`^[0-9]{17}[0-9X]$`)
if err != nil {
return false
}
if !reg.Match([]byte(idStr)) {
return false
}
var signChar = subString(idStr, 17, 1)
a1Str := getSignCodeForIDNumber(idStr)
return a1Str == signChar
}

func getSignCodeForIDNumber(idStr string) string {

//a1与对应的校验码对照表,其中key表示a1,value表示校验码,value中的10表示校验码X
var a1Map = map[int]int{
0: 1,
Expand All @@ -57,37 +72,25 @@ func (id IDNumber) IsValid() bool {
9: 3,
10: 2,
}

var idStr = strings.ToUpper(string(id))
var reg, err = regexp.Compile(`^[0-9]{17}[0-9X]$`)
if err != nil {
return false
}
if !reg.Match([]byte(idStr)) {
return false
}
var sum int
var signChar = ""
for index, c := range idStr {
var i = 18 - index
if i != 1 {
if index != 17 {
if v, err := strconv.Atoi(string(c)); err == nil {
//计算加权因子
var weight = int(math.Pow(2, float64(i-1))) % 11
sum += v * weight
} else {
return false
return ""
}
} else {
signChar = string(c)
}
}
var a1 = a1Map[sum%11]
var a1Str = fmt.Sprintf("%d", a1)
if a1 == 10 {
a1Str = "X"
}
return a1Str == signChar
return a1Str
}

func subString(str string, begin, length int) string {
Expand Down
40 changes: 26 additions & 14 deletions IDNumber/IDNumber_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
package IDNumber

import (
"fmt"
"testing"
)

Expand All @@ -17,35 +16,32 @@ func TestIDNumber_IsValid(t *testing.T) {
}
for index, id := range IDs_True {
var id = New(id)
if !id.IsValid() {
t.Fatal(id)
return
}
var birthday = id.GetBirthday()
if birthday == nil {
t.Failed()
t.Fatal(id)
return
}
var gender = id.GetGender()
if gender == -1 {
t.Failed()
t.Fatal(id)
return
}
genderMap := map[Gender]string{
Female: "女",
Male: "男",
}
switch index {
case 0:
if gender != Female {
t.Failed()
t.Fatal(id)
return
}
case 1:
if gender != Male {
t.Failed()
t.Fatal(id)
return
}
}
if id.IsValid() {
fmt.Printf("%-4d%s -> %s\t生日:%s-%s-%s 性别:%s \n", index, id, "✅", birthday.Year, birthday.Month, birthday.Day, genderMap[gender])
} else {
fmt.Printf("%-4d%s -> %s\t生日:%s-%s-%s 性别:%s \n", index, id, "❌", birthday.Year, birthday.Month, birthday.Day, genderMap[gender])
}
}

var IDs_False = []string{
Expand All @@ -54,6 +50,11 @@ func TestIDNumber_IsValid(t *testing.T) {
}
for _, id := range IDs_False {
var id = New(id)

if id.IsValid() {
t.Failed()
return
}
var birthday = id.GetBirthday()
if birthday != nil {
t.Failed()
Expand All @@ -64,3 +65,14 @@ func TestIDNumber_IsValid(t *testing.T) {
}
}
}

func TestRandomCard(t *testing.T) {
for i := 0; i < 1000; i++ {
cardStr := Random()
card := New(cardStr)
if !card.IsValid() {
t.Fatal(cardStr)
break
}
}
}
Loading

0 comments on commit 6e7882a

Please sign in to comment.