You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

51 lines
1.2 KiB

package rand
import (
mrand "math/rand"
)
const (
strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // 62 characters
)
// Str constructs a random alphanumeric string of given length
// from math/rand's global default Source.
func Str(length int) string { return buildString(length, mrand.Int63) }
// StrFromSource produces a random string of a specified length from
// the specified random source.
func StrFromSource(r *mrand.Rand, length int) string { return buildString(length, r.Int63) }
func buildString(length int, picker func() int64) string {
if length <= 0 {
return ""
}
chars := make([]byte, 0, length)
for {
val := picker()
for i := 0; i < 10; i++ {
v := int(val & 0x3f) // rightmost 6 bits
if v >= 62 { // only 62 characters in strChars
val >>= 6
continue
} else {
chars = append(chars, strChars[v])
if len(chars) == length {
return string(chars)
}
val >>= 6
}
}
}
}
// Bytes returns n random bytes generated from math/rand's global default Source.
func Bytes(n int) []byte {
bs := make([]byte, n)
for i := 0; i < len(bs); i++ {
// nolint:gosec // G404: Use of weak random number generator
bs[i] = byte(mrand.Int() & 0xFF)
}
return bs
}