来自crypto / rand的随机64位整数

时间:2017-06-11 10:24:44

标签: go random

我想使用安全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()之类的东西。任何想法如何实现这一目标?

2 个答案:

答案 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
}

https://play.golang.org/p/fqoQxpmjOSu