50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
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)
|
||
}
|