golang中md5.Sum(data)和md5.New().Sum(data)

本文原创,转载请注明:https://www.cnblogs.com/tkblack/p/11533874.html

学习了一段时间golang,在生成md5校验码时遇到一个问题,我们生成md5一般采用以下方式:

data := []byte("hello")
hash := md5.New()
bytes := hash.Sum(nil)
fmt.Printf("%x\n", bytes)    //output:5d41402abc4b2a76b9719d911017c592

或者

data := []byte("hello")
bytes := md5.Sum(data)
fmt.Printf("%x\n", bytes)   //output:5d41402abc4b2a76b9719d911017c592

以上两种方式都可以获得正确的md5校验值,当然,还是有点区别的,前一种返回的bytes是[]byte类型,后一种返回的是[Size]byte类型,这里Size=16。

接下来,我们看另一种处理方式:

data := []byte("hello")
hash := md5.New()
bytes := hash.Sum(data)
fmt.Printf("%x\n", bytes)    //output:68656c6c6fd41d8cd98f00b204e9800998ecf8427e

显然这个结果是不相符的(不能说是错误),从长度上就能看出区别,那么这里究竟有什么区别呢?其实,这里调用的是两个不同的函数,我们直接看源码:

md5.Sum(data):

// Sum returns the MD5 checksum of the data.
func Sum(data []byte) [Size]byte {
	var d digest
	d.Reset()
	d.Write(data)
	return d.checkSum()
}

md5.New().Sum(data):

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[:]...)
}

这样,我们就很直观的看到区别了,前者是调用checkSum()方法;后者,先调用checkSum(),再将in和结果进行拼接。所以,这两个Sum函数虽然同名,但却是不同的实现,前者属于md5包的公共函数,后者是digest结构体的成员函数。

 

posted @ 2019-09-17 14:59  tkblack  阅读(5639)  评论(0编辑  收藏  举报