我无法使用时间戳种子获取随机sha256哈希:
https://play.golang.org/p/2-_VPe3oFr(不要使用游乐场 - 时间总是一样)
有谁理解为什么它总会返回相同的结果? (非游乐场跑)
答案 0 :(得分:8)
因为你这样做:
timestamp := time.Now().Unix()
log.Print(fmt.Sprintf("%x", sha256.Sum256([]byte(string(timestamp))))[:45])
您打印数据的SHA-256摘要的十六进制形式:
[]byte(string(timestamp))
究竟是什么?
timestamp
的类型为int64
,converting it to string is:
将有符号或无符号整数值转换为字符串类型会生成包含整数的UTF-8表示形式的字符串。超出有效Unicode代码点范围的值将转换为" \ uFFFD"。
但是它的值不是一个有效的unicode代码点,所以它始终是"\uFFFD"
efbfbd
(UTF-8编码),并且你的代码总是打印数据的SHA-256 { {1}}这是(或者更确切地说是前45个十六进制数字,因为您对结果进行切片):
[]byte{0xef, 0xbf, 0xbd}
我想你想生成一些随机字节并计算出它的SHA-256,如下所示:
83d544ccc223c057d2bf80d3f2a32982c32c3c0db8e26
请注意,如果您使用crypto/rand
软件包而不是data := make([]byte, 10)
for i := range data {
data[i] = byte(rand.Intn(256))
}
fmt.Printf("%x", sha256.Sum256(data))
,则可以使用rand.Read()
函数填充带有随机值的字节切片,并且您不需要&# 39;甚至必须设置种子(所以你甚至不需要math/rand
包):
time
答案 1 :(得分:3)