1 回答

TA貢獻2036條經驗 獲得超8個贊
通常不會對傳遞的切片進行哈希處理。傳遞的切片用作目標:它將當前哈希附加到它,并且不會更改基礎哈希狀態。 顯然在哈希計算中包括傳遞的切片。這兩個例子根本不同,不同的結果只是預期的。hasher.Sum()
hasher.Write()
請務必閱讀文檔。散 列。哈希總和()
:
// Sum appends the current hash to b and returns the resulting slice.
// It does not change the underlying hash state.
Sum(b []byte) []byte
因此,當您第一次調用時,無論您傳遞給它什么,就結果哈希而言都無關緊要。如果您之前沒有寫入任何內容,您將看到初始哈希值。hasher.Sum()hasher
當您下次調用 時,您將把 的字節寫入哈希,因此當您調用 next 時,您將看到 計算出的哈希值。由于您通過了 ,因此將分配一個新的切片來容納結果。hasher.Write([]byte(input))inputhasher.Sum(nil)inputnil
當您再次調用 時,如前所述:這不會更改哈希狀態,傳遞的切片不用作輸入,而僅用作“返回”結果的目標,即當前哈希值。因此,您將獲得與上次調用相同的哈希值。顯然,如果傳遞的切片沒有足夠的容量來存儲結果,則將分配/使用新的切片。hasher.Write([]byte(input))hasher.Sum(nil)
請參閱此完整且可運行的示例,該示例可重現您的輸出:
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 關注
- 92 瀏覽
添加回答
舉報