固定長が4のバイト配列があります。
token := make([]byte, 4)
各バイトをランダムなバイトに設定する必要があります。最も効率的な方法で、どうすればできますか? math/Rand
メソッドは、私に関する限り、Random Byte関数を提供しません。
おそらく組み込みの方法がありますか、ランダム文字列を生成してバイト配列に変換する必要がありますか?
import "math/Rand"
func Read(p []byte) (n int, err error)
Readは、デフォルトのSourceからlen(p)ランダムバイトを生成し、pに書き込みます。常にlen(p)とnilエラーを返します。
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]
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
_よりもはるかに低速です。
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
}