在golang中实现md5编码主要使用crypto md5库
计算字符串md5值
package main
import (
"crypto/md5"
"fmt"
"io"
)
func main() {
h := md5.New()
io.WriteString(h, "The fog is getting thicker!")
io.WriteString(h, "And Leon's getting laaarger!")
fmt.Printf("%x\n", h.Sum(nil))
// output: e2c569be17396eca2a2e3c11578123ed
// 直接使用md5 ew对象的Write方式也是一样的
h2 := md5.New()
h2.Write([]byte("The fog is getting thicker!"))
h2.Write([]byte("And Leon's getting laaarger!"))
fmt.Printf("%x\n", h2.Sum(nil))
// output: e2c569be17396eca2a2e3c11578123ed
}
运行
$ go run md5.go
e2c569be17396eca2a2e3c11578123ed
e2c569be17396eca2a2e3c11578123ed
计算文件md5值
计算文件md5值和字符串类似,只是需要打开一个文件,将file的内容io.Copy到md5.New对象。
测试文件md5test.log内容:
md5test.log
func md5File() {
file, err := os.Open("md5test.log")
if err != nil {
panic(err)
}
h := md5.New()
_, err = io.Copy(h, file)
if err != nil {
return
}
fmt.Printf("%x\n", h.Sum(nil))
// output: 43c6359298645ded23f3c2ee44acf564
}
运行
$ go run md5file.go
43c6359298645ded23f3c2ee44acf564
关于md5编码文件这边踩过一个坑:在做文件上传功能时,通过此法计算出了文件的md5值,后来也是通过io.Copy函数想写入文件,但是发现目标文件一直为空,后来才想到应当是偏移量(seek)的问题,继上面的例子:
// 经过io.Copy操作后,file的偏移量(seek)被指向了最后面
// 如果还需要使用则需要修改file色偏移量(seek)
// 该行代码输出为空,因为file的seed已经位于最后了
io.Copy(os.Stdin, file)
// output:
fmt.Print("\n")
file.Seek(0, 0)
// 该行输出文件的内容,因为file的偏移量(seek)被设置为0了
io.Copy(os.Stdin, file)
// output: md5test.log
fmt.Print("\n")
运行
$ go run md5file.go
43c6359298645ded23f3c2ee44acf564
md5test.log