备注
go官方文档 https://pkg.go.dev/crypto/md5 已经给出如何使用该package生成文件或者字节数组的摘要值, 参照即可。 摘要值不是对文内容的加密,它主要用来进行checksum,就是验证两个文件内容是否一致,是否被篡改或者变化了。
简介
“crypto/sha256”
“crypto/md5”
“crypto/sha1”
根据文档介绍, 可直接通过如下方式对字节数据或者文件流进行摘要获取
对字节数据获取摘要
s := "Foo"
md5 := md5.Sum([]byte(s))
sha1 := sha1.Sum([]byte(s))
sha256 := sha256.Sum256([]byte(s))
fmt.Printf("%x\n", md5)
fmt.Printf("%x\n", sha1)
fmt.Printf("%x\n", sha256)
对文件取摘要值示例。 将如下示例代码中的sha256.New() 替换为h := sha1.New(), 即可获取sha1值, 通过fmt.Printf(“%x\n”, sum)获取摘要值的字符串, 也可以通过hex.EncodeToString(md5Byte) 将摘要值encode为可以打印的字符串。
func main() {
f, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
h := sha256.New()
if _, err := io.Copy(h, f); err != nil {
log.Fatal(err)
}
fmt.Printf("%x", h.Sum(nil))
}
示例代码
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"os"
)
func calcFileMD5(filePath string) (string, error) {
file, err := os.Open(filePath)
if err != nil {
return "", err
}
md5Handle := md5.New()
_, _ = io.Copy(md5Handle, file)
md5Byte := md5Handle.Sum(nil) //计算 MD5 值,返回 []byte
md5str := fmt.Sprintf("%x", md5Byte) //将 []byte 转为 string
fmt.Printf("md5Byte:%v, md5str:%v\n", md5Byte, md5str)
return hex.EncodeToString(md5Byte), nil
}
func main() {
dir, err := os.Getwd()
if err != nil {
fmt.Println("Error getting current directory: ", err)
return
}
fmt.Println("Current dir: ", dir)
var fileName = "file1.txt"
md5Val, err := calcFileMD5(fileName)
if err != nil {
fmt.Printf("fail to calc md5 for file %v, errMsg:%v\n", fileName, err)
} else {
fmt.Printf("md5 for file %v is %v\n", fileName, md5Val)
}
fmt.Println("字符串的md5值demo")
str := "要取摘要的字符串abc"
md5Handle := md5.New()
_, err = io.WriteString(md5Handle, str)
if err != nil {
fmt.Printf("fail to calc md5 for string %v is errMsg:%v\n", str, err)
return
}
md5ValByte := md5Handle.Sum(nil)
// 输出16进制格式的MD5字符串
fmt.Printf("%x\n", md5ValByte)
md5str := hex.EncodeToString(md5ValByte)
fmt.Printf("md5 for string %v is %v. lenght:%d\n", str, md5str, len(md5ValByte))
fmt.Println("byte 数组的md5值demo")
dataByte := []byte("要取摘要的数据") // 将字符串转换为byte数组
md5Val16Byte := md5.Sum(dataByte) // 对data进行MD5哈希计算
// 输出16进制格式的MD5字符串
fmt.Printf("%x\n", md5Val16Byte)
sliceFrom16ByteArray := md5Val16Byte[:]
md5str = hex.EncodeToString(sliceFrom16ByteArray)
fmt.Printf("md5 for byte[] %v is %v. lenght:%d\n", dataByte, md5str, len(md5Val16Byte))
}