为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
芜湖不芜 2021-12-20 14:35:45
我有一个字节数组,固定长度为 4。token := make([]byte, 4)我需要将每个字节设置为一个随机字节。在最有效的情况下,我怎样才能做到这一点?math/rand就我而言,这些方法不提供随机字节函数。也许有一种内置方式,或者我应该生成一个随机字符串并将其转换为字节数组?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

包兰特


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 main


import (

    "math/rand"

    "fmt"

)


func main() {

    token := make([]byte, 4)

    rand.Read(token)

    fmt.Println(token)

}

输出:


[187 163 35 30]


查看完整回答
反对 回复 2021-12-20
?
慕斯709654

TA贡献1840条经验 获得超5个赞

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.


查看完整回答
反对 回复 2021-12-20
?
慕斯王

TA贡献1864条经验 获得超2个赞

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.


查看完整回答
反对 回复 2021-12-20
  • 3 回答
  • 0 关注
  • 517 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信