Golang Random Sha256

use*_*858 4 string random type-conversion sha256 go

我无法使用时间戳种子获取随机sha256哈希:

https://play.golang.org/p/2-_VPe3oFr(不要使用游乐场 - 时间总是一样)

有谁知道为什么它总会返回相同的结果?(非游乐场跑步)

icz*_*cza 10

因为你这样做:

timestamp := time.Now().Unix()
log.Print(fmt.Sprintf("%x", sha256.Sum256([]byte(string(timestamp))))[:45])
Run Code Online (Sandbox Code Playgroud)

您打印数据的SHA-256摘要的十六进制形式:

[]byte(string(timestamp))
Run Code Online (Sandbox Code Playgroud)

究竟是什么?

timestamp是类型int64,将其转换为字符串是:

将有符号或无符号整数值转换为字符串类型会生成包含整数的UTF-8表示形式的字符串.超出有效Unicode代码点范围的值将转换为"\ uFFFD".

但是,它的价值是不是一个有效的Unicode代码点,因此将永远"\uFFFD"efbfbd(UTF-8编码),以及你的代码始终打印的SHA-256的数据[]byte{0xef, 0xbf, 0xbd}是(或者更确切地说,它的第45个十六进制数字,因为你切片结果):

83d544ccc223c057d2bf80d3f2a32982c32c3c0db8e26
Run Code Online (Sandbox Code Playgroud)

我想你想生成一些随机字节并计算它的SHA-256,如下所示:

data := make([]byte, 10)
for i := range data {
    data[i] = byte(rand.Intn(256))
}
fmt.Printf("%x", sha256.Sum256(data))
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用该crypto/rand包而不是math/rand,您可以使用该rand.Read()函数用随机值填充一片字节,您甚至不必设置种子(因此您甚至不需要time包):

data := make([]byte, 10)
if _, err := rand.Read(data); err == nil {
    fmt.Printf("%x", sha256.Sum256(data))
}
Run Code Online (Sandbox Code Playgroud)