1 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
通常不會對傳遞的切片進(jìn)行哈希處理。傳遞的切片用作目標(biāo):它將當(dāng)前哈希附加到它,并且不會更改基礎(chǔ)哈希狀態(tài)。 顯然在哈希計(jì)算中包括傳遞的切片。這兩個(gè)例子根本不同,不同的結(jié)果只是預(yù)期的。hasher.Sum()
hasher.Write()
請務(wù)必閱讀文檔。散 列。哈??偤停ǎ?/code>
:
// Sum appends the current hash to b and returns the resulting slice.
// It does not change the underlying hash state.
Sum(b []byte) []byte
因此,當(dāng)您第一次調(diào)用時(shí),無論您傳遞給它什么,就結(jié)果哈希而言都無關(guān)緊要。如果您之前沒有寫入任何內(nèi)容,您將看到初始哈希值。hasher.Sum()hasher
當(dāng)您下次調(diào)用 時(shí),您將把 的字節(jié)寫入哈希,因此當(dāng)您調(diào)用 next 時(shí),您將看到 計(jì)算出的哈希值。由于您通過了 ,因此將分配一個(gè)新的切片來容納結(jié)果。hasher.Write([]byte(input))inputhasher.Sum(nil)inputnil
當(dāng)您再次調(diào)用 時(shí),如前所述:這不會更改哈希狀態(tài),傳遞的切片不用作輸入,而僅用作“返回”結(jié)果的目標(biāo),即當(dāng)前哈希值。因此,您將獲得與上次調(diào)用相同的哈希值。顯然,如果傳遞的切片沒有足夠的容量來存儲結(jié)果,則將分配/使用新的切片。hasher.Write([]byte(input))hasher.Sum(nil)
請參閱此完整且可運(yùn)行的示例,該示例可重現(xiàn)您的輸出:
input := "hi"
hasher := md5.New()
fmt.Println(hex.EncodeToString(hasher.Sum([]byte(input))))
hasher.Write([]byte(input))
fmt.Println(hex.EncodeToString(hasher.Sum(nil)))
fmt.Printf("%x\n", md5.Sum([]byte(input)))
在 Go 游樂場試用。
- 1 回答
- 0 關(guān)注
- 98 瀏覽
添加回答
舉報(bào)