2016-03-03 99 views
3

我有一个字节数组,具有4生成随机的,固定长度的字节数组在Go

token := make([]byte, 4) 

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

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

+0

1.您有一个字节切片(未阵列)。 2.在需要之前不要担心效率问题。 3.)考虑加密/兰德,而不是数学/兰德(或偶尔从密码/兰特种子数学/兰德)。 4)io.ReadFull很方便。 – Volker

回答

8

Package rand

import "math/rand" 

func Read

func Read(p []byte) (n int, err error) 

读生成LEN(P)从默认源随机字节和写入 它们为p。它总是返回len(p)和一个零错误。

˚Func (*Rand) Read

func (r *Rand) Read(p []byte) (n int, err error) 

读生成LEN(p)的随机字节,并将其写入到第它总是 返回len(p)和一个零错误。

例如,

package main 

import (
    "math/rand" 
    "fmt" 
) 

func main() { 
    token := make([]byte, 4) 
    rand.Read(token) 
    fmt.Println(token) 
} 

输出:

[187 163 35 30] 
3

转到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()) 

注:在进入1.6,没有math/rand.Read()功能,但(现在仍然是)一个crypto/rand.Read()功能n,但crypto/rand包实现了密码安全的伪随机数生成器,因此它比math/rand慢得多。

+1

'rand.Read'总是返回'nil'错误,所以没有必要处理它 - 即使它是一个可敬的习惯...... :) – Aedolon

+0

@Aedolon是的,只是补充说。 – icza

相关问题