web-dev-qa-db-ja.com

Goでのランダムな固定長バイト配列の生成

固定長が4のバイト配列があります。

token := make([]byte, 4)

各バイトをランダムなバイトに設定する必要があります。最も効率的な方法で、どうすればできますか? math/Randメソッドは、私に関する限り、Random Byte関数を提供しません。

おそらく組み込みの方法がありますか、ランダム文字列を生成してバイト配列に変換する必要がありますか?

16
Momo

パッケージランド

import "math/Rand" 

読み取り機能

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

Readは、デフォルトのSourceからlen(p)ランダムバイトを生成し、pに書き込みます。常にlen(p)とnilエラーを返します。

f nc(* Rand)Read

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

読み取りはlen(p)ランダムバイトを生成し、pに書き込みます。常にlen(p)とnilエラーを返します。

例えば、

package main

import (
    "math/Rand"
    "fmt"
)

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

出力:

[187 163 35 30]
28
peterSO

Go 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)
_

_math/Rand_パッケージを使用する前に、 Rand.Seed() を呼び出して適切に初期化することを忘れないでください。例:

_Rand.Seed(time.Now().UnixNano())
_

注:Go 1.6より前のバージョンではmath/Rand.Read()関数はありませんでしたが、 crypto/Rand.Read() 関数はありましたが、 _crypto/Rand_ パッケージは暗号的に安全な擬似乱数ジェネレータを実装しているため、_math/Rand_よりもはるかに低速です。

10
icza

Math.Randの使用は、オペレーティングシステムが提供するシステムCSPRNGを使用していることを意味します。これは、/ dev/urandom /とWindowsのCryptGenRandom APIを使用することを意味します。ありがたいことに、Goの暗号化/ランドパッケージは、これらの実装の詳細を抽象化して、誤用のリスクを最小限に抑えます。

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
}
4
GraphicalDot