You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

相同字符串生成不同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

火山引擎 最新活动