本文共 1388 字,大约阅读时间需要 4 分钟。
golang中的MD5是由 crypto/md5
包来提供的。
md5 包导出两个方法
func New() hash.Hashfunc Sum(data []byte) [Size]byte
Size 为16
,意味着返回的加密结果为长度是16个字节的数组,即128位的二进制数,每一个字节可以由2个16进制的字符来表示,于是 md5 的结果一般是由32位的16进制字符来表示(0-9,a-f)。
re := md5.Sum([]byte("123456")) fmt.Printf("%x\n", re) // e10adc3949ba59abbe56e057f20f883e
Sum 方法返回的是 [16]bytefmt.Printf("%v\n", re) // [225 10 220 57 73 186 89 171 190 86 224 87 242 15 136 62]
%x 表示按照16进制来表示,如果需要大写的字符,使用 %X。
123456 为要加密的字符串。h := md5.New()h.Write([]byte("123456"))re := h.Sum(nil)fmt.Printf("%x\n", re)
h := md5.New()f, err := os.Open("./note.ttt")if err != nil { return}io.Copy(h, f)re := h.Sum(nil)fmt.Printf("%x\n", re)
前面出现了两个 Sum 方法,看着有点迷糊。
md5.Sum 是直接将字节切片做md5运算,函数原型:func Sum(data []byte) [Size]byte { var d digest d.Reset() d.Write(data) return d.checkSum()}
md5.New 返回一个实现了 hash.Hash 接口的对象,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进制表示。
转载地址:http://hcaui.baihongyu.com/