w00*_*00d 6 hash md5 cryptography go md5sum
package main
import (
"crypto/md5"
"fmt"
)
func main() {
hash := md5.New()
b := []byte("test")
fmt.Printf("%x\n", hash.Sum(b))
hash.Write(b)
fmt.Printf("%x\n", hash.Sum(nil))
}
Run Code Online (Sandbox Code Playgroud)
输出:
*md5.digest74657374d41d8cd98f00b204e9800998ecf8427e
098f6bcd4621d373cade4e832627b4f6
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么/如何为这两个印刷品得到不同的结果?
nem*_*emo 10
我正在积累已经很好的答案.我不确定它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
Run Code Online (Sandbox Code Playgroud)
这个功能有一个双用例,你似乎以一种不幸的方式混合.用例是:
如果您只是想计算某些内容的哈希值,请使用md5.Sum(data)或
digest := md5.New()
digest.Write(data)
hash := digest.Sum(nil)
Run Code Online (Sandbox Code Playgroud)
此代码将,根据上述文档的摘录,附加的校验和data来nil,造成的校验和data.
如果你想链接几个哈希块,第二个用例hash.Sum,你可以这样做:
hashed := make([]byte, 0)
for hasData {
digest.Write(data)
hashed = digest.Sum(hashed)
}
Run Code Online (Sandbox Code Playgroud)
这会将每个迭代的哈希值附加到已经计算的哈希值.可能不是你想要的.
所以,现在您应该能够了解代码失败的原因.如果没有,请使用此注释版本的代码(正在播放):
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()
Run Code Online (Sandbox Code Playgroud)