相同字符串生成不同MD5哈希值问题排查求助
问题根源:复用了全局MD5哈希器实例
你的问题出在全局定义的hasher变量上——这个哈希器实例会被多次调用复用,每次调用GetMD5Hash时,你都是在同一个哈希器的现有状态上追加写入新的字符串,而不是重新计算当前字符串的MD5值。
举个实际场景的例子:
- 第一次调用传入用户密码"123456",哈希器写入并计算这个字符串的MD5,结果正确。
- 第二次调用传入另一个用户的密码"abcdef",哈希器会在之前"123456"的基础上追加写入"abcdef",最终计算的是"123456abcdef"的MD5,自然和单独计算"abcdef"的结果完全不匹配。
修复方案
你有两种可行的修复方式,推荐第一种(更简洁且无状态风险):
方案1:每次调用创建新的哈希器实例
直接在函数内部每次新建MD5哈希器,这样每次都是独立计算当前字符串的哈希,彻底避免状态复用问题:
func GetMD5Hash(text string) string { fmt.Println(">> ", text, "<<") hasher := md5.New() // 每次调用都初始化新的哈希器 hasher.Write([]byte(text)) return hex.EncodeToString(hasher.Sum(nil)) }
方案2:重置全局哈希器的状态
如果你坚持要复用全局哈希器(其实MD5实例创建成本极低,没必要),可以在每次写入前调用Reset()清空之前的状态:
var hasher = md5.New() func GetMD5Hash(text string) string { fmt.Println(">> ", text, "<<") hasher.Reset() // 重置哈希器,清除之前的所有写入数据 hasher.Write([]byte(text)) return hex.EncodeToString(hasher.Sum(nil)) }
这两种方式都能保证每次调用GetMD5Hash时,都是基于当前传入的字符串单独计算MD5,不会受到之前调用的影响。
内容的提问来源于stack exchange,提问作者user5794711




