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.
48 lines
902 B
48 lines
902 B
package generate
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/binary"
|
|
mathRand "math/rand"
|
|
"strconv"
|
|
)
|
|
|
|
const alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"
|
|
|
|
func generateWeak(length int, prefix string) string {
|
|
result := prefix
|
|
for len(result) < length {
|
|
result += string(alphabet[mathRand.Intn(len(alphabet))])
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Generate generates an ID either strongly or weakly depending on the system.
|
|
func Generate(length int, prefix string) string {
|
|
var buffer [32]byte
|
|
|
|
result := prefix
|
|
offset := 0
|
|
|
|
_, err := rand.Read(buffer[:32])
|
|
if err != nil {
|
|
return generateWeak(length, prefix)
|
|
}
|
|
|
|
for len(result) < length {
|
|
result += strconv.FormatUint(binary.LittleEndian.Uint64(buffer[offset:]), 36)
|
|
offset += 8
|
|
|
|
if offset >= 32 {
|
|
_, err = rand.Read(buffer[:32])
|
|
if err != nil {
|
|
return generateWeak(length, prefix)
|
|
}
|
|
|
|
offset = 0
|
|
}
|
|
}
|
|
|
|
return result[:length]
|
|
}
|