go生成文件md5、sha1摘要简单示例

备注

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))
}

你可能感兴趣的:(go,golang)