0%

Go 语言学习笔记:计算字符串哈希值

需求

昨天使用 Go 完成了一个小小的爬虫和展示的 web 项目,抓取了5000首古诗文,并能够呈现在自己的网站上。为了避免古诗文的重复,我将古诗文内容进行了 md5 哈希,并作为唯一索引。Go 语言中的哈希并不像 PHP 中那样简单,但是经过实践,也能够快速的理解并使用 Go 语言中的哈希算法。

使用

Golang的加密库都放在crypto目录下,其中MD5库在crypto/md5包中,该包主要提供了New、Write和Sum方法。

  • New 方法用于生成 digest 结构;
  • Write 方法 用于向 digest 结构中写入需要进行哈希的字符串([]byte类型);
  • Sum 方法接收一个参数,将字符串进行哈希并将哈希值拼接在参数后,其内部实现是先使用 checkSum 方法(不对外暴露)进行哈希并将结果拼接在参数后。
1
2
3
4
5
6
type digest struct {
s [4]uint32
x [chunk]byte
nx int
len uint64
}

因此,加密流程如下所示:

1
2
3
c2 := md5.New()
c2.Write([]byte(`hello world`))
c2.Sum([]byte(nil)))

其实有一种更简便的方法,在 md5.go 中,提供了一个 Sum 函数 直接串行了上述方法,因此,上述代码可合并为:

1
md5.Sum([]byte(`hello world`))

上述程序的放回结果为128bit (也就是32位)的16进制数组,如果需要将其转化为 string 类型,需要使用hex.EncodeToString 函数,并需要将数组转化为 slice, 例如:

1
2
3
c1 := md5.Sum([]byte(`hello world`))
fmt.Println(hex.EncodeToString(c1[:]))
//返回“5eb63bbbe01eeed093cb22bb8f5acdc3”

延伸

sha256 方法和 md5 方法的使用方法完全相同,可尝试使用。

1
2
c2 := sha256.Sum256([]byte("hello world"))
fmt.Println(hex.EncodeToString(c2[:]))