我在浏览mattermost代码时遇到了两个问题
data []byte是1+(length*5/8)?为什么length乘以5?rand.Read?在 Linux 和 FreeBSD 上,rand.Read如果可用,使用 getrandom(2)package main
import (
"fmt"
"crypto/rand"
"encoding/base32"
)
func main() {
fmt.Println("Hello, playground")
fmt.Println(NewRandomString(64))
}
var encoding = base32.NewEncoding("ybndrfg8ejkmcpqxot1uwisza345h769")
// NewRandomString returns a random string of the given length.
// The resulting entropy will be (5 * length) bits.
func NewRandomString(length int) string {
data := make([]byte, 1+(length*5/8))
rand.Read(data)
return encoding.EncodeToString(data)[:length]
}
Run Code Online (Sandbox Code Playgroud)
你可以试试:https : //play.golang.org/p/WcS667bP407
因为它返回的是一个 base32 字符串,而 base32 字符串的每个字符都包含 5 位信息。因此,例如,如果要生成 40 个字符的 base32 字符串,则需要 200 位随机性,这是通过读取 25(即 200 / 8)个随机字节来实现的。