diff --git a/backend/verifyCode/cmd/verifyCode/main.go b/backend/verifyCode/cmd/verifyCode/main.go index 4830be6..de7593f 100644 --- a/backend/verifyCode/cmd/verifyCode/main.go +++ b/backend/verifyCode/cmd/verifyCode/main.go @@ -2,7 +2,9 @@ package main import ( "flag" + "math/rand" "os" + "time" "verifyCode/internal/conf" @@ -79,7 +81,8 @@ func main() { panic(err) } defer cleanup() - + //set rand seed + rand.Seed(time.Now().UnixNano()) // start and wait for stop signal if err := app.Run(); err != nil { panic(err) diff --git a/backend/verifyCode/internal/service/verifycode.go b/backend/verifyCode/internal/service/verifycode.go index 27e0748..128583e 100644 --- a/backend/verifyCode/internal/service/verifycode.go +++ b/backend/verifyCode/internal/service/verifycode.go @@ -3,7 +3,6 @@ package service import ( "context" "math/rand" - pb "verifyCode/api/verifyCode" ) @@ -27,24 +26,56 @@ func RandCode(l int, r pb.TYPE) string { fallthrough case pb.TYPE_DIGIT: - return randcode("0123456789", l) + return randcode("0123456789", l, 4) case pb.TYPE_LETTRE: - return randcode("abcdefghigklmnopqrstuvwxyz", l) + return randcode("abcdefghigklmnopqrstuvwxyz", l, 5) case pb.TYPE_MIXED: - return randcode("0123456789abcdefghigklmnopqrstuvwxyz", l) + return randcode("0123456789abcdefghigklmnopqrstuvwxyz", l, 6) default: - + return "" } - return "" } -// 随机的核心方法 -func randcode(chars string, l int) string { - charsLen := len(chars) +// 随机数和新方法:优化实现 +// 一次随机多次使用,分部分多次使用 +func randcode(chars string, l, idxBits int) string { + //计算有效的二进制数,基于char的长度 + //推荐写死,chars固定,idxBits固定 + + //形成掩码。mask + //例如,使用低六位:00000000000111111 + idxMask := 1<>= idxBits + //减少一次使用次数 + remain-- } return string(result) } + +// 随机的核心方法:简单实现 +//func randcode(chars string, l int) string { +// charsLen := len(chars) +// result := make([]byte, l) +// for i := 0; i < l; i++ { +// randIndex := rand.Intn(charsLen) +// result[i] = chars[randIndex] +// } +// return string(result) +//}