亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

困惑為什么哈希姆,編碼,打印是不同的,然后寫,哈希姆,編碼,打印在Go中?

困惑為什么哈希姆,編碼,打印是不同的,然后寫,哈希姆,編碼,打印在Go中?

Go
慕哥6287543 2022-09-26 17:29:28
很抱歉標題。我無法想出更好的方法來表達我的問題,如果其他人可以的話,我會很高興地改變它。哈舍爾定義為hasher := md5.New()無論如何,我很好奇為什么會這樣:fmt.Println(hex.EncodeToString(hasher.Sum([]byte(input))))給我 6869d41d8cd98f00b204e9800998ecf8427e,而這個:hasher.Write([]byte(input)) fmt.Println(hex.EncodeToString(hasher.Sum(nil))給我49f68a5c8493ec2c0bf489821c21fc3b和這個:fmt.Printf("%x\n", md5.Sum([]byte(input)))給我49f68a5c8493ec2c0bf489821c21fc3b。
查看完整描述

1 回答

?
慕桂英3389331

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 游樂場試用。


查看完整回答
反對 回復 2022-09-26
  • 1 回答
  • 0 關注
  • 92 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號