我有一个字节数组,具有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