困惑为什么哈希姆,编码,打印是不同的,然后写,哈希姆,编码,打印在Go中?

很抱歉标题。我无法想出更好的方法来表达我的问题,如果其他人可以的话,我会很高兴地改变它。

哈舍尔定义为

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。



慕哥6287543
浏览 100回答 1
1回答

慕桂英3389331

通常不会对传递的切片进行哈希处理。传递的切片用作目标:它将当前哈希附加到它,并且不会更改基础哈希状态。 显然在哈希计算中包括传递的切片。这两个例子根本不同,不同的结果只是预期的。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 游乐场试用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go