| 12 | } |
| 13 | |
| 14 | func RandStringBytesMaskImprSrcSB(n int) string { |
| 15 | sb := strings.Builder{} |
| 16 | sb.Grow(n) |
| 17 | // A src.Int63() generates 63 random bits, enough for letterIdxMax characters! |
| 18 | for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; { |
| 19 | if remain == 0 { |
| 20 | cache, remain = src.Int63(), letterIdxMax |
| 21 | } |
| 22 | if idx := int(cache & letterIdxMask); idx < len(letterBytes) { |
| 23 | sb.WriteByte(letterBytes[idx]) |
| 24 | i-- |
| 25 | } |
| 26 | cache >>= letterIdxBits |
| 27 | remain-- |
| 28 | } |
| 29 | |
| 30 | return sb.String() |
| 31 | } |
| 32 | |
| 33 | var ( |
| 34 | src = rand.New(rand.NewSource(time.Now().UnixNano())) |