我想使用安全crypto/rand
包生成64位随机整数。我在网上找到了这个:
package main
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
}
但它似乎生成随机字节。我想要一个随机的64位int。也就是说,我想要var i uint64 = rand()
之类的东西。任何想法如何实现这一目标?
答案 0 :(得分:2)
您可以使用crypto.Rand
生成随机数,然后使用binary
包将这些字节转换为int64:
func randint64() (int64, error) {
var b [8]byte
if _, err := rand.Read(b[:]); err != nil {
return 0, err
}
return int64(binary.LittleEndian.Uint64(b[:])), nil
}
https://play.golang.org/p/2Q8tvttqbJ(结果已缓存)
如果查看source code for LittleEndian.Uint64
,您可以看到它只是对数据执行了一些操作;你可以为自己实现的东西。
答案 1 :(得分:0)
您还可以在rand.Int
软件包中使用crypto/rand
func randint64() (int64, error) {
val, err := rand.Int(rand.Reader, big.NewInt(int64(math.MaxInt64)))
if err != nil {
return 0, err
}
return val.Int64(), nil
}