golang中的MD5是由 crypto/md5
包来提供的。
md5 包导出两个方法
func New() hash.Hash
func Sum(data []byte) [Size]byte
Size 为16
,意味着返回的加密结果为长度是16个字节的数组,即128位的二进制数,每一个字节可以由2个16进制的字符来表示,于是 md5 的结果一般是由32位的16进制字符来表示(0-9,a-f)。
1、简单的md5
re := md5.Sum([]byte("123456"))
fmt.Printf("%x\n", re) // e10adc3949ba59abbe56e057f20f883e
Sum 方法返回的是 [16]byte
fmt.Printf("%v\n", re) // [225 10 220 57 73 186 89 171 190 86 224 87 242 15 136 62]
%x 表示按照16进制来表示,如果需要大写的字符,使用 %X。
123456 为要加密的字符串。
2、更通用的md5
加密给定字符串
h := md5.New()
h.Write([]byte("123456"))
re := h.Sum(nil)
fmt.Printf("%x\n", re)
加密文件内容
h := md5.New()
f, err := os.Open("./")
if err != nil {
return
}
io.Copy(h, f)
re := h.Sum(nil)
fmt.Printf("%x\n", re)
增加前缀
前面出现了两个 Sum 方法,看着有点迷糊。
是直接将字节切片做md5运算,函数原型:
func Sum(data []byte) [Size]byte {
var d digest
d.Reset()
d.Write(data)
return d.checkSum()
}
返回一个实现了 接口的对象,new(digest) 就是 digest 的指针对象。
func New() hash.Hash {
d := new(digest)
d.Reset()
return d
}
func (d *digest) Sum(in []byte) []byte {
// Make a copy of d so that caller can keep writing and summing.
d0 := *d
hash := d0.checkSum()
return append(in, hash[:]...)
}
此Sum方法是先做了md5加密,然后在前面增加一个 in 的前缀。
h := md5.New()
h.Write([]byte("123456"))
re := h.Sum([]byte("123"))
fmt.Printf("%x\n", re)
123456的md5结果是:
e10adc3949ba59abbe56e057f20f883e
增加前缀123后的结果:
313233e10adc3949ba59abbe56e057f20f883e
前面多出了 313233 ,正好就是 123 这三个字节对应的16进制表示。