crypto/md5 包基本用法


crypto/md5 包实现了 MD5 哈希算法。

基本用法

package main

import (
	"crypto/md5"
	"fmt"
)

func main() {
	// 计算字符串的 MD5
	data := []byte("Hello, World!")
	hash := md5.Sum(data)

	// 输出十六进制格式
	fmt.Printf("MD5: %x\n", hash)
}

使用 Hash 接口

package main

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

func main() {
	// 创建哈希器
	h := md5.New()

	// 分多次写入数据
	h.Write([]byte("Hello, "))
	h.Write([]byte("World!"))

	// 计算哈希
	sum := h.Sum(nil)

	// 输出结果
	fmt.Printf("MD5 (hex): %s\n", hex.EncodeToString(sum))
	fmt.Printf("MD5 (raw): %x\n", sum)
}

文件 MD5

package main

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

func main() {
	// 打开文件
	file, err := os.Open("test.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 创建 MD5 哈希器
	hash := md5.New()

	// 复制文件内容到哈希器
	if _, err := io.Copy(hash, file); err != nil {
		panic(err)
	}

	// 获取哈希值
	md5Value := hex.EncodeToString(hash.Sum(nil))
	fmt.Printf("文件 MD5: %s\n", md5Value)
}

校验文件完整性

package main

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

// FileMD5 计算文件的 MD5 值
func FileMD5(filename string) (string, error) {
	file, err := os.Open(filename)
	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
}

// VerifyFile 验证文件 MD5
func VerifyFile(filename, expectedMD5 string) (bool, error) {
	actualMD5, err := FileMD5(filename)
	if err != nil {
		return false, err
	}
	return actualMD5 == expectedMD5, nil
}

func main() {
	// 创建测试文件
	os.WriteFile("test.txt", []byte("test content"), 0644)

	// 计算 MD5
	md5Value, err := FileMD5("test.txt")
	if err != nil {
		panic(err)
	}
	fmt.Printf("文件 MD5: %s\n", md5Value)

	// 验证文件
	ok, _ := VerifyFile("test.txt", md5Value)
	fmt.Printf("验证结果: %v\n", ok)

	// 清理
	os.Remove("test.txt")
}

总结

方法 说明
md5.Sum(data) 直接计算数据的 MD5
md5.New() 创建 Hash 接口实例
h.Write(data) 向哈希器写入数据
h.Sum(nil) 获取最终的哈希值
如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo