我正在建立已经很好的答案。我不确定是否Sum
真的是你想要的功能。从hash.Hash
文档中:
// Sum appends the current hash to b and returns the resulting slice.
// It does not change the underlying hash state.
Sum(b []byte) []byte
这个函数有一个双重用例,你似乎以一种不幸的方式混合在一起。用例是:
- 计算单次运行的哈希
- 链接多次运行的输出
如果您只是想计算某物的哈希值,请使用md5.Sum(data)
或
digest := md5.New()
digest.Write(data)
hash := digest.Sum(nil)
根据上述文档的摘录,此代码将把 的校验和附加data
到nil
,从而生成 的校验和data
。
如果你想链接几个哈希块,第二个用例hash.Sum
,你可以这样做:
hashed := make([]byte, 0)
for hasData {
digest.Write(data)
hashed = digest.Sum(hashed)
}
这会将每个迭代的散列附加到已经计算的散列上。可能不是你想要的。
所以,现在您应该能够看到您的代码失败的原因。如果没有,请使用您的代码的此注释版本(On play):
hash := md5.New()
b := []byte("test")
fmt.Printf("%x\n", hash.Sum(b)) // gives 74657374<hash> (74657374 = "test")
fmt.Printf("%x\n", hash.Sum([]byte("AAA"))) // gives 414141<hash> (41 = 'A')
fmt.Printf("%x\n", hash.Sum(nil)) // gives <hash> as append(nil, hash) == hash
fmt.Printf("%x\n", hash.Sum(b)) // gives 74657374<hash> (74657374 = "test")
fmt.Printf("%x\n", hash.Sum([]byte("AAA"))) // gives 414141<hash> (41 = 'A')
hash.Write(b)
fmt.Printf("%x\n", hash.Sum(nil)) // gives a completely different hash since internal bytes changed due to Write()