为了账号安全,请及时绑定邮箱和手机立即绑定

困惑为什么哈希姆,编码,打印是不同的,然后写,哈希姆,编码,打印在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 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号