gpt4 book ai didi

go - 如何使用 "crypto/rand"包生成随机整数?

转载 作者:IT老高 更新时间:2023-10-28 13:04:04 25 4
gpt4 key购买 nike

假设我想生成一个介于 0 到 27 之间的安全随机整数:

func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)

"crypto/rand" 包中。

我该怎么做?

我不太明白它是如何工作的,为什么它不返回内置的 Go 整数之一而不是指向某个 big.Int 类型的指针?

编辑:

这对于 token 来说是否足够安全?

func getToken(length int) string {
token := ""
codeAlphabet := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
codeAlphabet += "abcdefghijklmnopqrstuvwxyz"
codeAlphabet += "0123456789"

for i := 0; i < length; i++ {
token += string(codeAlphabet[cryptoRandSecure(int64(len(codeAlphabet)))])
}
return token
}

func cryptoRandSecure(max int64) int64 {
nBig, err := rand.Int(rand.Reader, big.NewInt(max))
if err != nil {
log.Println(err)
}
return nBig.Int64()
}

func main() {
fmt.Println(getToken(32))
}

这将输出如下内容:

qZDbuPwNQGrgVmZCU9A7FUWbp8eIfn0Z

EwZVoQ5D5SEfdhiRsDfH6dU6tAovILCZ

cOqzODVP0GwbiNBwtmqLA78rFgV9d3VT

最佳答案

这是一些工作代码:

package main

import (
"fmt"
"crypto/rand"
"math/big"
)

func main() {
nBig, err := rand.Int(rand.Reader, big.NewInt(27))
if err != nil {
panic(err)
}
n := nBig.Int64()
fmt.Printf("Here is a random %T in [0,27) : %d\n", n, n)
}

但是要生成一个随机 token ,我会这样做:

package main

import (
"crypto/rand"
"encoding/base32"
"fmt"
)

func main() {
token := getToken(10)
fmt.Println("Here is a random token : ", token)
}

func getToken(length int) string {
randomBytes := make([]byte, 32)
_, err := rand.Read(randomBytes)
if err != nil {
panic(err)
}
return base32.StdEncoding.EncodeToString(randomBytes)[:length]
}

关于go - 如何使用 "crypto/rand"包生成随机整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32349807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com