博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang中的MD5哈希算法
阅读量:3988 次
发布时间:2019-05-24

本文共 1388 字,大约阅读时间需要 4 分钟。

golang中的MD5是由 crypto/md5 包来提供的。

md5 包导出两个方法

func New() hash.Hashfunc 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]bytefmt.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("./note.ttt")if err != nil {
return}io.Copy(h, f)re := h.Sum(nil)fmt.Printf("%x\n", re)
增加前缀

前面出现了两个 Sum 方法,看着有点迷糊。

md5.Sum 是直接将字节切片做md5运算,函数原型:

func Sum(data []byte) [Size]byte {
var d digest d.Reset() d.Write(data) return d.checkSum()}

md5.New 返回一个实现了 hash.Hash 接口的对象,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进制表示。

转载地址:http://hcaui.baihongyu.com/

你可能感兴趣的文章
ML:激活函数和损失函数
查看>>
ML:KNN
查看>>
Mac:bits/stdc++.h
查看>>
C++:结构体初始化和赋值
查看>>
C++:优先队列
查看>>
ML:naive bayes
查看>>
HDUOJ:2196(tree dp)
查看>>
codeforces:1140C(greedy)
查看>>
HDUOJ:2222(AC auto)
查看>>
HDUOJ:1277(AC auto)
查看>>
ML:随机森林、GBDT、XGBoost
查看>>
牛客OJ:逆序数对
查看>>
牛客OJ:不用加减乘除法做加法
查看>>
牛客OJ:最大子序列和(dp)
查看>>
牛客OJ:判断平衡二叉树
查看>>
牛客OJ:统计n以内所有数中各个位上1出现的个数
查看>>
牛客OJ:可以返回当前最小值的栈
查看>>
牛客OJ:字符串左移
查看>>
牛客OJ:对称二叉树
查看>>
牛客OJ:在排序数组中查找数字
查看>>