【问题标题】:Golang Random Sha256Golang随机Sha256
【发布时间】:2015-05-10 02:50:12
【问题描述】:

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

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

有谁明白为什么它总是返回相同的结果? (非游乐场跑)

【问题讨论】:

  • 请发布您的代码。 (play.golang.org 的链接很好,但它不能替代代码本身。)
  • 你为什么想要一个“随机 sha256 哈希”? sha256 哈希不是随机的;它是其输入的确定性函数。如果你需要的是一个 256 位的随机序列,为什么要涉及 sha256?

标签: string random go type-conversion sha256


【解决方案1】:

因为你这样做:

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 编码),并且您的代码始终打印数据 []byte{0xef, 0xbf, 0xbd} 的 SHA-256,即(或者更确切地说是它的前 45 个十六进制数字,因为您对结果进行了切片):

83d544ccc223c057d2bf80d3f2a32982c32c3c0db8e26

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

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

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

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

【讨论】:

    【解决方案2】:

    是的。这个:

    string(timestamp)
    

    没有做你认为它做的事,见the spec。长话短说,时间戳不是有效的 unicode 代码点,因此结果始终为“\uFFFD”。

    【讨论】:

      猜你喜欢
      • 2014-12-08
      • 2019-09-28
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多