猿问

在 Go 中生成一个随机的、固定长度的字节数组

我有一个字节数组,固定长度为 4。

token := make([]byte, 4)

我需要将每个字节设置为一个随机字节。在最有效的情况下,我怎样才能做到这一点?math/rand就我而言,这些方法不提供随机字节函数。

也许有一种内置方式,或者我应该生成一个随机字符串并将其转换为字节数组?


芜湖不芜
浏览 519回答 3
3回答

隔江千里

包兰特import "math/rand" 功能读取func Read(p []byte) (n int, err error)Read 从默认 Source 生成 len(p) 个随机字节并将它们写入 p。它总是返回 len(p) 和一个 nil 错误。函数(*Rand) 读取func (r *Rand) Read(p []byte) (n int, err error)Read 生成 len(p) 个随机字节并将它们写入 p。它总是返回 len(p) 和一个 nil 错误。例如,package mainimport (    "math/rand"    "fmt")func main() {    token := make([]byte, 4)    rand.Read(token)    fmt.Println(token)}输出:[187 163 35 30]

慕斯709654

Go 1.6 向math/rand包中添加了一个新函数:func Read(p []byte) (n int, err error)它byte用随机数据填充传递的切片。使用这个rand.Read():token := make([]byte, 4)if _, err := rand.Read(token); err != nil {    // Handle err}fmt.Println(token)rand.Read()有 2 个返回值:“读取”字节数和一个(可选)error。这是为了符合通用io.Reader接口,但文档rand.Read()状态(尽管有签名)它永远不会实际返回非nil错误,因此我们可以省略检查它,这将其简化为:token := make([]byte, 4)rand.Read(token)fmt.Println(token)rand.Seed()在使用math/rand包之前不要忘记调用以正确初始化它,例如:rand.Seed(time.Now().UnixNano())注意:在 Go 1.6 之前没有math/rand.Read()函数,但是有(现在仍然是)一个crypto/rand.Read()函数,但是这个crypto/rand包实现了一个加密安全的伪随机数生成器,所以它比math/rand.

慕斯王

Go 1.6 向math/rand包中添加了一个新函数:func Read(p []byte) (n int, err error)它byte用随机数据填充传递的切片。使用这个rand.Read():token := make([]byte, 4)if _, err := rand.Read(token); err != nil {    // Handle err}fmt.Println(token)rand.Read()有 2 个返回值:“读取”字节数和一个(可选)error。这是为了符合通用io.Reader接口,但文档rand.Read()状态(尽管有签名)它永远不会实际返回非nil错误,因此我们可以省略检查它,这将其简化为:token := make([]byte, 4)rand.Read(token)fmt.Println(token)rand.Seed()在使用math/rand包之前不要忘记调用以正确初始化它,例如:rand.Seed(time.Now().UnixNano())注意:在 Go 1.6 之前没有math/rand.Read()函数,但是有(现在仍然是)一个crypto/rand.Read()函数,但是这个crypto/rand包实现了一个加密安全的伪随机数生成器,所以它比math/rand.
随时随地看视频慕课网APP

相关分类

Go
我要回答