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)
|
|||
|
}
|