2016-03-03 94 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

相關問題