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
}
使用场景
- 文件校验:验证文件完整性
- 密码存储:不推荐,建议使用bcrypt
- 数据去重:基于哈希值判断数据是否相同
- 缓存键:生成唯一标识符
注意事项
安全警告: MD5已被证明存在碰撞漏洞,不应用于安全敏感场景。对于密码存储,建议使用bcrypt或argon2。
- 不适用于密码:使用bcrypt或argon2替代
- 存在碰撞风险:不同输入可能产生相同输出
- 性能考虑:MD5速度较快,适合非安全场景