|
|
- package common
-
- import (
- crand "crypto/rand"
- "encoding/hex"
- "math/rand"
- )
-
- const (
- strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // 62 characters
- )
-
- func init() {
- // Seed math/rand with "secure" int64
- b := RandBytes(8)
- var seed uint64
- for i := 0; i < 8; i++ {
- seed |= uint64(b[i])
- seed <<= 8
- }
- rand.Seed(int64(seed))
- }
-
- // Constructs an alphanumeric string of given length.
- // Not crypto safe
- func RandStr(length int) string {
- chars := []byte{}
- MAIN_LOOP:
- for {
- val := rand.Int63()
- 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 {
- break MAIN_LOOP
- }
- val >>= 6
- }
- }
- }
-
- return string(chars)
- }
-
- // Crypto safe
- func RandBytes(numBytes int) []byte {
- b := make([]byte, numBytes)
- _, err := crand.Read(b)
- if err != nil {
- panic(err)
- }
- return b
- }
-
- // Crypto safe
- // RandHex(24) gives 96 bits of randomness, strong enough for most purposes.
- func RandHex(numDigits int) string {
- return hex.EncodeToString(RandBytes(numDigits / 2))
- }
|