1 回答

TA贡献2036条经验 获得超8个赞
通常不会对传递的切片进行哈希处理。传递的切片用作目标:它将当前哈希附加到它,并且不会更改基础哈希状态。 显然在哈希计算中包括传递的切片。这两个例子根本不同,不同的结果只是预期的。hasher.Sum()
hasher.Write()
请务必阅读文档。散 列。哈希总和()
:
// Sum appends the current hash to b and returns the resulting slice.
// It does not change the underlying hash state.
Sum(b []byte) []byte
因此,当您第一次调用时,无论您传递给它什么,就结果哈希而言都无关紧要。如果您之前没有写入任何内容,您将看到初始哈希值。hasher.Sum()hasher
当您下次调用 时,您将把 的字节写入哈希,因此当您调用 next 时,您将看到 计算出的哈希值。由于您通过了 ,因此将分配一个新的切片来容纳结果。hasher.Write([]byte(input))inputhasher.Sum(nil)inputnil
当您再次调用 时,如前所述:这不会更改哈希状态,传递的切片不用作输入,而仅用作“返回”结果的目标,即当前哈希值。因此,您将获得与上次调用相同的哈希值。显然,如果传递的切片没有足够的容量来存储结果,则将分配/使用新的切片。hasher.Write([]byte(input))hasher.Sum(nil)
请参阅此完整且可运行的示例,该示例可重现您的输出:
input := "hi"
hasher := md5.New()
fmt.Println(hex.EncodeToString(hasher.Sum([]byte(input))))
hasher.Write([]byte(input))
fmt.Println(hex.EncodeToString(hasher.Sum(nil)))
fmt.Printf("%x\n", md5.Sum([]byte(input)))
在 Go 游乐场试用。
- 1 回答
- 0 关注
- 99 浏览
添加回答
举报