go-md5-两种方式

167 阅读1分钟
 求md5主要有两种方式:
 1 has := md5.Sum(data); md5str1 := fmt.Sprintf("%x", has); 这种直接计算md5的值;
 2 w := md5.New(); w.Write([]byte{49, 50, 51, 52}); md5str2 := fmt.Sprintf("%x", w.Sum(nil)) 生成md5对象,然后根据io.Writer的接口往md5对象里写数据,再调用md5对象的Sum方法。
package main

import (
	"crypto/md5"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {
	str := "abc1231234"



	//方法一 Sum
	data := []byte(str)
	has := md5.Sum(data)
	md5str1 := fmt.Sprintf("%x", has) //将[]byte转成16进制

	fmt.Println(md5str1) // output 6f1e11851fdf41fc304dab6eabb6cc24

	//方法二-1

	w := md5.New()

	io.WriteString(w, "abc123") //将str写入到w中
	w.Write([]byte{49, 50, 51, 52})
	md5str2 := fmt.Sprintf("%x", w.Sum(nil)) //w.Sum(nil)将w的hash转成[]byte格式
	fmt.Println(md5str2)                     // output 6f1e11851fdf41fc304dab6eabb6cc24

	// 方法二-2
	//data = append(data, 49, 50, 51, 52)
	md5Code := fmt.Sprintf("%x", md5.New().Sum(nil))
	fmt.Println(md5Code) // output d41d8cd98f00b204e9800998ecf8427e

	// 方法二-3  file md5
	currentPath, _ := os.Getwd()
	fileName := currentPath + string(os.PathSeparator) + "1.log"
	f, err := os.Open(fileName)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	h := md5.New()
	if _, err := io.Copy(h, f); err != nil {
		log.Fatal(err)
	}

	fmt.Printf("file md5:%x\n", h.Sum(nil)) // output file md5:138208eb5bccb98b8212c4a7dfc64e65
}