调用 Write(val) 然后调用 Sum(nil) 与哈希中的 Sum(val) 之间的区别?
Difference between calling Write(val) then Sum(nil) compared to Sum(val) in hash?
我正在研究使用 Go 的 crypto 包,我有一个简单的例子,我正在尝试弄清楚。我知道我可以将 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))
}
Running it 产生这个输出:
b10a8db164e0754105b7a99be72e3fe5
48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e
在伪代码中,我希望:
h.Write(part1)
h.Write(part2)
result := h.Sum(part3)
会产生与
相同的结果
result := h.Sum(part1 + part2 + part3)
但在我上面的简单示例中,我什至无法让单个部件在两种情况下产生相同的输出。 Write
神秘地从 the GoLang pkg site listing for md5 中消失了,这让我相信我可能用错了。我特别困惑的是,如果我只使用 Sum
方法,我会得到比平常更长的散列。
这是怎么回事?
编辑:我决定打印 val
的十六进制并注意到它与 h2.Sum(val)
输出的开头完全匹配。比较:
val: 48656c6c6f20576f726c64
h2: 48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e
我肯定做错了什么。我应该完全避免 Write
函数并坚持使用 io
吗?
Sum 将当前散列附加到参数和 returns 结果。该参数未添加到散列中。
提供该参数是为了让应用程序在获取哈希时可以避免分配。许多应用程序不需要此优化,只需调用 h.Sum(nil)
即可。
我正在研究使用 Go 的 crypto 包,我有一个简单的例子,我正在尝试弄清楚。我知道我可以将 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))
}
Running it 产生这个输出:
b10a8db164e0754105b7a99be72e3fe5
48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e
在伪代码中,我希望:
h.Write(part1)
h.Write(part2)
result := h.Sum(part3)
会产生与
相同的结果result := h.Sum(part1 + part2 + part3)
但在我上面的简单示例中,我什至无法让单个部件在两种情况下产生相同的输出。 Write
神秘地从 the GoLang pkg site listing for md5 中消失了,这让我相信我可能用错了。我特别困惑的是,如果我只使用 Sum
方法,我会得到比平常更长的散列。
这是怎么回事?
编辑:我决定打印 val
的十六进制并注意到它与 h2.Sum(val)
输出的开头完全匹配。比较:
val: 48656c6c6f20576f726c64
h2: 48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e
我肯定做错了什么。我应该完全避免 Write
函数并坚持使用 io
吗?
Sum 将当前散列附加到参数和 returns 结果。该参数未添加到散列中。
提供该参数是为了让应用程序在获取哈希时可以避免分配。许多应用程序不需要此优化,只需调用 h.Sum(nil)
即可。