我正在考虑使用 Go 的加密包,我有一个简单的例子,我想弄清楚。我知道我可以使用io.WriteString散列,但我想在将它与另一个库连接之前直接了解散列对象。
package main
import (
"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))
}
运行它会产生以下输出:
b10a8db164e0754105b7a99be72e3fe5
48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e
在伪代码中,我希望:
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吗?
牛魔王的故事
相关分类