golang中的MD5哈希算法

时间:2025-03-02 11:22:15

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进制表示。