package service import ( "context" "math/rand" pb "verifyCode/api/verifyCode" ) type VerifyCodeService struct { pb.UnimplementedVerifyCodeServer } // 构造器 func NewVerifyCodeService() *VerifyCodeService { return &VerifyCodeService{} } func (s *VerifyCodeService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeRequest) (*pb.GetVerifyCodeReply, error) { return &pb.GetVerifyCodeReply{ Code: RandCode(int(req.Length), req.Type), }, nil } func RandCode(l int, r pb.TYPE) string { switch r { case pb.TYPE_DEFAULT: fallthrough case pb.TYPE_DIGIT: return randcode("0123456789", l, 4) case pb.TYPE_LETTRE: return randcode("abcdefghigklmnopqrstuvwxyz", l, 5) case pb.TYPE_MIXED: return randcode("0123456789abcdefghigklmnopqrstuvwxyz", l, 6) default: return "" } } // 随机数和新方法:优化实现 // 一次随机多次使用,分部分多次使用 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) //}