package service import ( "context" "math/rand" "strings" 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, t pb.TYPE) string { switch t { case pb.TYPE_DEFAULT: fallthrough //跟下面那个保持一样 case pb.TYPE_DIGIT: return randCode("0123456789", 4, l) case pb.TYPE_LETTER: return randCode("abcdefghijklmnopqrstuvwxyz", 5, l) case pb.TYPE_MIXED: return randCode("0123456789abcdefghijklnmopqrstuvwxyz", 6, l) default: } return "" } //// 最简单实现版本 //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) //} func randCode(chars string, idxBits, l int) string { // 形成掩码 idxMask := 1<= 0; { // 随机缓存不足,重新生成 if remain == 0 { cache, remain = rand.Int63(), idxMax } // 利用掩码生成随机索引,有效索引为小于字符集合长度 if idx := int(cache & int64(idxMask)); idx < len(chars) { sb.WriteByte(chars[idx]) i-- } // 利用下一组随机数位 cache >>= idxBits remain-- } return sb.String() }