昨日看到了某公众号的一个小字谜,谜底是某位古代人物的字,然后以UTF-8格式对其进行MD5运算,emm...., 运算一亿次。一开始在网上搜索到了对应的Python代码,然后拿来在阿里云服务器(学生版,2核)上跑了一下,代码如下:
import hashlib
str1 = '曹孟德'
str_md5 = hashlib.md5(str1.encode(encoding='utf-8')).hexdigest()
for _ in range(100000000 - 1):
str_md5 = hashlib.md5(str_md5.encode(encoding='utf-8')).hexdigest()
print('MD5加密后为 :' + str_md5)
耗时大概97秒左右。
➜ ~ time python3 test.py
MD5加密后为 :358831229ed758f6293990b6d70726e0
python3 test.py 97.10s user 0.02s system 99% cpu 1:37.13 total
接着试图用Go来写,想着会不会快一些,因为官方标准库里自带md5的package(不得不说,Golang的标准库真的是省心),于是一开始写出了下面的代码:
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
)
func main() {
name := "曹孟德"
h := md5.New()
h.Write([]byte(name))
middle := hex.EncodeToString(h.Sum(nil))
for i := 1; i 100000000; i++ {
h.Write([]byte(middle))
middle = hex.EncodeToString(h.Sum(nil))
}
fmt.Printf("%s\n", middle)
}
于是发现了一个问题,从第二次MD5的值开始,就开始对不上Python版的MD5值了,后来百思不得姐,经过若干小时的抓瞎尝试,发现在下一次MD5之前,需要执行一次Reset操作,嗯,也就是需要在for循环里加一行代码,下面是正确的版本:
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
)
func mai