为了账号安全,请及时绑定邮箱和手机立即绑定

与散列中的 Sum(val) 相比,调用 Write(val) 然后 Sum(nil) 之间的区别?

与散列中的 Sum(val) 相比,调用 Write(val) 然后 Sum(nil) 之间的区别?

Go
慕少森 2021-09-13 14:37:54
我正在考虑使用 Go 的加密包,我有一个简单的例子,我想弄清楚。我知道我可以使用io.WriteString散列,但我想在将它与另一个库连接之前直接了解散列对象。package mainimport (    "crypto/md5"    "fmt")func main() {    val := []byte("Hello World")    h := md5.New()    h.Write(val)    fmt.Printf("%x\n", h.Sum(nil))    fmt.Println()    h2 := md5.New()    fmt.Printf("%x\n", h2.Sum(val))}运行它会产生以下输出:b10a8db164e0754105b7a99be72e3fe548656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e在伪代码中,我希望:h.Write(part1)h.Write(part2)result := h.Sum(part3)会产生相同的结果result := h.Sum(part1 + part2 + part3)但在我上面的简单示例中,我什至无法让单个部件在两种情况下产生相同的输出。在 md5 的 GoLang pkg 站点列表中Write神秘失踪,这让我相信我可能使用错误。我特别困惑的是,如果我只使用该方法,我会得到比平常更长的哈希值。Sum这里发生了什么?编辑:我决定打印十六进制 forval并注意到它与h2.Sum(val)输出的开头完全匹配。比较:val: 48656c6c6f20576f726c64 h2: 48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e我肯定做错了什么。我应该Write完全避免使用该功能并坚持使用io吗?
查看完整描述

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

Sum将当前散列附加到参数并返回结果。该参数不会添加到哈希中。

提供该参数是为了使应用程序可以在获取哈希时避免分配。许多应用程序不需要这种优化,只需调用h.Sum(nil).


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 313 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信