package utils import ( tRand "crypto/rand" "math/big" "math/rand" "time" ) var defaultLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") // GetPseudoRandomCode 伪随机数(性能高) func GetPseudoRandomCode(n int, allowedChars ...[]rune) string { //rand.Seed(time.Now().UnixNano()) rand.New(rand.NewSource(time.Now().UnixNano())) var letters []rune if len(allowedChars) == 0 { letters = defaultLetters } else { letters = allowedChars[0] } b := make([]rune, n) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) } // GetTrueRandomCode 真随机数 (在linux上已经有一个实现就是/dev/urandom,crypto/rand 就是从这个地方读“真随机”数字返回,但性能比较慢) func GetTrueRandomCode(n int, allowedChars ...[]rune) string { var letters []rune if len(allowedChars) == 0 { letters = defaultLetters } else { letters = allowedChars[0] } b := make([]rune, n) for i := range b { n, _ := tRand.Int(tRand.Reader, big.NewInt(int64(len(letters)))) b[i] = letters[n.Int64()] } return string(b) }