mylomen-server/common/utils/randomUtil.go

50 lines
1.1 KiB
Go
Raw Normal View History

2024-04-29 19:35:18 +08:00
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/urandomcrypto/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)
}