Golang md5 Sum()函数

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)

这个功能有一个双用例,你似乎以一种不幸的方式混合.用例是:

  1. 计算单次运行的哈希值
  2. 链接几个运行的输出

如果您只是想计算某些内容的哈希值,请使用md5.Sum(data)

digest := md5.New()
digest.Write(data)
hash := digest.Sum(nil)
Run Code Online (Sandbox Code Playgroud)

此代码将,根据上述文档的摘录,附加的校验和datanil,造成的校验和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)