import(
"crypto/rand"
"encoding/base64"
)
// GenerateRandomBytes returns securely generated random bytes.
// It will return an error if the system's secure random
// number generator fails to function correctly, in which
// case the caller should not continue.
func GenerateRandomBytes(n int) ([]byte, error) {
b := make([]byte, n)
_, err := rand.Read(b)
// Note that err == nil only if we read len(b) bytes.
if err != nil {
return nil, err
}
return b, nil
}
4条答案
按热度按时间qvsjd97n1#
Package rand
func读取
Read从默认的Source中生成len(p)个随机字节,并将它们写入p。它总是返回len(p)和一个nil错误。
func(* 兰德)读取
Read生成len(p)随机字节并将它们写入p。它总是返回len(p)和一个nil错误。
比如说,
输出量:
czfnxgou2#
Go 1.6在
math/rand
包中添加了一个新函数:其用随机数据填充所传递的
byte
片。使用rand.Read()
:rand.Read()
有两个返回值:“读取”字节数和(可选)error
。这是为了符合一般的io.Reader
接口,但是rand.Read()
的文档声明(尽管它有签名)它实际上永远不会返回非nil
错误,所以我们可以省略检查它,这将它简化为:在使用
math/rand
包之前,不要忘记调用rand.Seed()
来正确初始化它,例如:注意:在Go 1.6之前没有
math/rand.Read()
函数,但是有(现在仍然是)crypto/rand.Read()
函数,但是crypto/rand
包实现了加密安全的伪随机数生成器,所以它比math/rand
慢得多。euoag5mw3#
使用math.兰德意味着您正在使用操作系统提供的系统CSPRNG。这意味着使用/dev/urandom/和Windows的CryptGenRandom API。值得庆幸的是,Go的crypto/兰德包将这些实现细节抽象出来,以最大限度地降低出错的风险。
xv8emn3q4#
对于较新版本的go,
math/rand
被认为是不推荐使用的,应该使用crypto/rand
。引用自It's Doc:rand.Read is deprecated: For almost all use cases, crypto/rand.Read is more appropriate