mirror of https://github.com/knative/func.git
37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
package random
|
|
|
|
import (
|
|
"crypto/rand"
|
|
)
|
|
|
|
const (
|
|
letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" // 52 possibilities
|
|
letterIdxBits = 6 // 6 bits to represent 64 possibilities / indexes
|
|
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
|
|
)
|
|
|
|
// AlphaString returns a random alphanumeric string of the requested length
|
|
// https://stackoverflow.com/a/35615565/145125
|
|
func AlphaString(length int) string {
|
|
result := make([]byte, length)
|
|
bufferSize := int(float64(length) * 1.3)
|
|
for i, j, randomBytes := 0, 0, []byte{}; i < length; j++ {
|
|
if j%bufferSize == 0 {
|
|
randomBytes = secureRandomBytes(bufferSize)
|
|
}
|
|
if idx := int(randomBytes[j%length] & letterIdxMask); idx < len(letterBytes) {
|
|
result[i] = letterBytes[idx]
|
|
i++
|
|
}
|
|
}
|
|
|
|
return string(result)
|
|
}
|
|
|
|
// secureRandomBytes returns the requested number of bytes using crypto/rand
|
|
func secureRandomBytes(length int) []byte {
|
|
randomBytes := make([]byte, length)
|
|
_, _ = rand.Read(randomBytes)
|
|
return randomBytes
|
|
}
|