Go中不同MD5哈希计算顺序得到结果不一致的原因是什么?
Go MD5三种写法结果不一致原因说明
核心原因:对hash.Hash接口的Sum方法作用理解错误
Go标准库中hash.Hash接口的Sum(b []byte)方法的作用是将当前已计算完成的哈希值追加到切片b的末尾,返回拼接后的新切片,不会将b的内容输入到哈希计算器中参与哈希计算。
三种写法的具体逻辑拆解
第一种写法错误原因:
你初始化hasher后没有调用Write写入任何内容,此时hasher中存储的是空输入对应的MD5值:d41d8cd98f00b204e9800998ecf8427e。调用hasher.Sum([]byte(input))时,是把空输入的MD5值直接追加到input对应的字节切片末尾,再做十六进制编码。
举个例子:如果你的input值为hi,对应的字节是[0x68, 0x69],拼接空输入的MD5后整体字节转十六进制,结果就是你拿到的6869d41d8cd98f00b204e9800998ecf8427e,完全匹配。第二种写法正确原因:
先调用hasher.Write([]byte(input))把输入内容写入哈希计算器参与计算,再调用hasher.Sum(nil),即把计算好的输入对应的MD5值追加到空切片中返回,编码后结果正确。第三种写法正确原因:
md5.Sum([]byte(input))是标准库封装的MD5计算便捷方法,内部逻辑等价于第二种写法:创建MD5实例、写入输入、返回计算完成的哈希值,因此结果和第二种写法完全一致。
内容的提问来源于stack exchange,提问作者minzi
相关产品推荐
相关产品推荐

