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

Mom*_*omo 17 arrays random go slice

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

token := make([]byte, 4)
Run Code Online (Sandbox Code Playgroud)

我需要将每个字节设置为一个随机字节.我怎么能这样做,在最有效的事情?math/rand就我而言,这些方法不提供随机字节功能.

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

pet*_*rSO 29

包rand

import "math/rand" 
Run Code Online (Sandbox Code Playgroud)

func阅读

func Read(p []byte) (n int, err error)
Run Code Online (Sandbox Code Playgroud)

Read从默认Source生成len(p)个随机字节,并将它们写入p.它总是返回len(p)和nil错误.

f unc(*Rand)阅读

func (r *Rand) Read(p []byte) (n int, err error)
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

[187 163 35 30]
Run Code Online (Sandbox Code Playgroud)

  • 在 rand.Read 之前调用 rand.Seed(),否则每次运行都会得到相同的输出 (4认同)

icz*_*cza 10

Go 1.6为math/rand包添加了一个新功能:

func Read(p []byte) (n int, err error)
Run Code Online (Sandbox Code Playgroud)

byte用随机数据填充传递的切片.使用这个rand.Read():

token := make([]byte, 4)
if _, err := rand.Read(token); err != nil {
    // Handle err
}
fmt.Println(token)
Run Code Online (Sandbox Code Playgroud)

rand.Read()有2个返回值:"读"字节数和(可选)error.这是为了符合通用io.Reader接口,但是rand.Read()状态文档(尽管它的签名)它永远不会实际返回非nil错误,所以我们可以省略检查它,这简化了它:

token := make([]byte, 4)
rand.Read(token)
fmt.Println(token)
Run Code Online (Sandbox Code Playgroud)

rand.Seed()在使用math/rand软件包之前,请不要忘记调用以正确初始化它,例如:

rand.Seed(time.Now().UnixNano())
Run Code Online (Sandbox Code Playgroud)

注意:在Go 1.6之前没有math/rand.Read()函数,但是有(并且仍然是)crypto/rand.Read()函数,但是crypto/rand软件包实现了加密安全的伪随机数生成器,所以它比它慢得多math/rand.

  • `rand.Read` 总是返回 `nil` 错误,所以没有必要处理它 - 即使这是一个值得尊敬的习惯......:) (2认同)

Gra*_*Dot 5

使用math.Rand意味着您正在使用操作系统提供的系统CSPRNG。这意味着使用/ dev / urandom /和Windows的CryptGenRandom API。值得庆幸的是,Go的crypto / rand软件包抽象了这些实现细节,以最大程度地减少出错的风险。

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
}
Run Code Online (Sandbox Code Playgroud)