在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
转载请注明:快乐编程 » golang中md5编码示例