在散列中调用Write(val)和Sum(nil)与Sum(val)之间的区别?

时间:2015-01-28 16:48:24

标签: hash go

我正在研究使用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))
}

Running it生成此输出:

b10a8db164e0754105b7a99be72e3fe5

48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e

在伪代码中,我希望:

h.Write(part1)
h.Write(part2)
result := h.Sum(part3)

会产生与

相同的结果
result := h.Sum(part1 + part2 + part3)

但是在我上面的简单示例中,我甚至无法在两种情况下获得单个部分来生成相同的输出。 the GoLang pkg site listing for md5神秘地遗漏了Write,这让我相信我可能错误地使用了它。我特别感到困惑的是,如果我只使用Sum方法,我会得到比平常更长的哈希值。

这里发生了什么?

编辑:我决定打印val的十六进制,并注意到它与h2.Sum(val)输出的开头完全匹配。为了比较:

val: 48656c6c6f20576f726c64
 h2: 48656c6c6f20576f726c64d41d8cd98f00b204e9800998ecf8427e

我肯定做错了什么。我应该完全避免使用Write功能并坚持使用io吗?

1 个答案:

答案 0 :(得分:3)

Sum将当前哈希附加到参数并返回结果。该参数未添加到哈希值。

提供参数,以便应用程序在获取哈希值时可以避免分配。许多应用程序不需要此优化,只需调用h.Sum(nil)即可。