rand.Read 的碰撞是什么

jk2*_*k2K 0 go mattermost

我在浏览mattermost代码时遇到了两个问题

  1. 为什么长度data []byte1+(length*5/8)?为什么length乘以5?
  2. 什么是碰撞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

参考https://github.com/mattermost/mattermost-server/blob/fc60a1e8dd9d1a225687aead0684035ee63d7562/model/utils.go#L184

hob*_*bbs 5

因为它返回的是一个 base32 字符串,而 base32 字符串的每个字符都包含 5 位信息。因此,例如,如果要生成 40 个字符的 base32 字符串,则需要 200 位随机性,这是通过读取 25(即 200 / 8)个随机字节来实现的。