Golang Random Sha256

时间:2015-03-09 00:45:47

标签: string random go type-conversion sha256

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

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

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

2 个答案:

答案 0 :(得分:8)

因为你这样做:

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

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

[]byte(string(timestamp))

究竟是什么?

timestamp的类型为int64converting 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)

是。这样:

string(timestamp)

不符合您的想法,请参阅the spec。长话短说,时间戳不是有效的unicode代码点,因此结果总是“\ uFFFD”。