随机值
math/rand
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
s := rand.NewSource(time.Now().Unix())
rd := rand.New(s)
fmt.Println(rd.Intn(100))
}
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func main() {
// 生成 0 到 10 的随机整数
randInt, _ := rand.Int(rand.Reader, big.NewInt(11)) // 生成 0 到 10 的随机整数
randomNum := randInt.Int64()
fmt.Println(randomNum)
//生成数组
td, _ := GenerateRandomBytes(5)
var ints = make([]int, len(td))
for i, b := range td {
ints[i] = int(b)
}
fmt.Println(ints)
}
func GenerateRandomBytes(n int) ([]byte, error) {
b := make([]byte, n)
_, err := rand.Read(b)
if err != nil {
return nil, err
}
return b, nil
}
生成随机 Token
在实际业务中经常需要生成随机 Token(如 API Key、会话令牌等),思路是先用 crypto/rand 读取指定字节数的密码学安全随机值,再用 hex.EncodeToString 编码为十六进制字符串。最终字符串长度是字节数的 2 倍,例如传入 32 得到 64 位字符的 Token:
package main
import (
"crypto/rand"
"encoding/hex"
"fmt"
)
func onboardGenerateToken(bytes int) string {
b := make([]byte, bytes)
_, _ = rand.Read(b)
return hex.EncodeToString(b)
}
func main() {
// 32 字节 -> 64 位十六进制字符
fmt.Println(onboardGenerateToken(32))
}
输出示例:
9d4f1a2b8c6e3f0d5a7b9c1e4f2d6a8b0c3e5f7d9a1b3c5e7f2d4a6b8c0e2f4d
注意:这里使用的是
crypto/rand(密码学安全)而非math/rand(伪随机),生成 Token、密钥等安全敏感场景必须使用前者。