7
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))
}

出力:

*md5.digest74657374d41d8cd98f00b204e9800998ecf8427e
098f6bcd4621d373cade4e832627b4f6

誰かが私に説明してもらえますか/2つの印刷で異なる結果が得られる理由/方法を教えてください。

4

4 に答える 4

2

実際にmd5.Sumバイト スライスを取得するには 2 つの方法があります。

func main() {
    hash := md5.New()
    b := []byte("test")
    hash.Write(b)
    fmt.Printf("way one : %x\n", hash.Sum(nil))
    fmt.Printf("way two : %x\n", md5.Sum(b))
}

http://golang.org/src/pkg/crypto/md5/md5.go#L88によると、あなたhash.Sum(b)append(b, actual-hash-of-an-empty-md5-hash).

の定義Sum:

func (d0 *digest) Sum(in []byte) []byte {
    // Make a copy of d0 so that caller can keep writing and summing.
    d := *d0
    hash := d.checkSum()
    return append(in, hash[:]...)
}

呼び出すとバイトスライスとして直接Sum(nil)返されますが、呼び出すと入力に追加されます。d.checkSum()Sum([]byte)d.checkSum()

于 2014-06-15T22:13:18.120 に答える
1

ドキュメントから:

    // Sum appends the current hash to b and returns the resulting slice.
    // It does not change the underlying hash state.
    Sum(b []byte) []byte

したがって、「*74657374*d41d8cd98f00b204e9800998ecf8427e」は、実際には「test」の 16 進数表現と、ハッシュの初期状態です。

fmt.Printf("%x", []byte{"test"})

結果は...「74657374」になります!

つまり、基本的にhash.Sum(b)は、あなたが思っていることをしていません。2 番目のステートメントは正しいハッシュです。

于 2014-06-15T22:03:07.517 に答える
0

要点をお伝えしたいと思います:

なぜ/どのように2つの印刷で異なる結果が得られるのですか?

答え:

hash := md5.New()

md5 の新しいインスタンスを作成すると、それ自体が空であるため、実際には md5 ハッシュとhash呼ばれるため、出力として得られます。hash.Sum(b)bhash74657374d41d8cd98f00b204e9800998ecf8427e

次のステートメントでは、ハッシュインスタンスにhash.Write(b)書き込み、それを呼び出すと、書き込んだばかりの md5 が計算され、前の値に合計されます。bhash.Sum(nil)b74657374d41d8cd98f00b204e9800998ecf8427e

これが、これらの出力を取得している理由です。

ご参考までに、SumAPIをご覧ください。

func (d0 *digest) Sum(in []byte) []byte {
85      // Make a copy of d0 so that caller can keep writing and summing.
86      d := *d0
87      hash := d.checkSum()
88      return append(in, hash[:]...)
89  }
于 2017-03-09T12:48:17.933 に答える