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)