我有一個字節數組,具有4生成隨機的,固定長度的字節數組在Go
token := make([]byte, 4)
我需要每個字節設置爲隨機字節的固定長度。我怎麼能這樣做,在最有效的事情?就我而言,math/rand
方法不提供隨機字節功能。
也許有一個內置的方式,或者我應該去產生一個隨機字符串並將其轉換爲字節數組?
我有一個字節數組,具有4生成隨機的,固定長度的字節數組在Go
token := make([]byte, 4)
我需要每個字節設置爲隨機字節的固定長度。我怎麼能這樣做,在最有效的事情?就我而言,math/rand
方法不提供隨機字節功能。
也許有一個內置的方式,或者我應該去產生一個隨機字符串並將其轉換爲字節數組?
import "math/rand"
func Read(p []byte) (n int, err error)
讀生成LEN(P)從默認源隨機字節和寫入 它們爲p。它總是返回len(p)和一個零錯誤。
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]
轉到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.您有一個字節切片(未陣列)。 2.在需要之前不要擔心效率問題。 3.)考慮加密/蘭德,而不是數學/蘭德(或偶爾從密碼/蘭特種子數學/蘭德)。 4)io.ReadFull很方便。 – Volker