kaisawind's blog
  • 关于
  • 所有帖子

golang的md5加密算法 - Mon, Nov 30, 2020

golang的md5加密算法

golang的md5加密算法

快速使用

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
)

func main() {
    // 方法1:使用fmt.Sprintf
    data := []byte("hello world")
    hash := md5.Sum(data)
    hashStr := fmt.Sprintf("%x", hash)
    fmt.Println(hashStr)
    
    // 方法2:使用hex.EncodeToString
    hashStr2 := hex.EncodeToString(hash[:])
    fmt.Println(hashStr2)
}

封装MD5函数

package main

import (
    "crypto/md5"
    "encoding/hex"
)

// MD5 计算字符串的MD5哈希值
func MD5(str string) string {
    hash := md5.Sum([]byte(str))
    return hex.EncodeToString(hash[:])
}

// MD5Bytes 计算字节切片的MD5哈希值
func MD5Bytes(data []byte) string {
    hash := md5.Sum(data)
    return hex.EncodeToString(hash[:])
}

// MD5File 计算文件的MD5哈希值
func MD5File(filePath string) (string, error) {
    data, err := os.ReadFile(filePath)
    if err != nil {
        return "", err
    }
    return MD5Bytes(data), nil
}

大文件MD5计算

func MD5LargeFile(filePath string) (string, error) {
    file, err := os.Open(filePath)
    if err != nil {
        return "", err
    }
    defer file.Close()
    
    hash := md5.New()
    if _, err := io.Copy(hash, file); err != nil {
        return "", err
    }
    
    return hex.EncodeToString(hash.Sum(nil)), nil
}

使用场景

  1. 文件校验:验证文件完整性
  2. 密码存储:不推荐,建议使用bcrypt
  3. 数据去重:基于哈希值判断数据是否相同
  4. 缓存键:生成唯一标识符

注意事项

安全警告: MD5已被证明存在碰撞漏洞,不应用于安全敏感场景。对于密码存储,建议使用bcrypt或argon2。

  1. 不适用于密码:使用bcrypt或argon2替代
  2. 存在碰撞风险:不同输入可能产生相同输出
  3. 性能考虑:MD5速度较快,适合非安全场景


辽ICP备2021007608号 | © 2026 | kaisawind

Facebook Twitter GitHub