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结构体的成员函数。