Golang计算md5值的方法都是接收byte型slice([]byte)。而且使用习惯上也觉得略奇怪。
看了好几个例子才看懂。
感觉Golang标准库在设计这些模块的时候,都会考虑使用带New关键字工厂生成一个该类型的结构体对象。然后再使用改对象的方法进行操作。
md5包就是这样,来看例子:
s := "api_key" + ApiKey + "param" + Param + "time" + time + "version" + version + ApiSecret signByte := []byte(s) hash := md5.New() hash.Write(signByte) return hex.EncodeToString(hash.Sum(nil))
第一行我拼接了一个字符串。
第二行我将这个字符串转成byte型数组并赋值给了sighByte。
第三行我new了一个md5的实现了hash.Hash的结构体。
第四行我调用这个结构体的方法Write将我需要计算md5的[]byte传入进去。
第五行我调用hex.EncodeToSring方法来把计算结果转换成16进制字符串。其中hash.Sum(nil)方法可以生成前面Write进去的signByte变量的128bit md5值。
这个hash.Sum方法并不是我们在操作其它语言的那种使用习惯,将值传递进去然后返回hash,这里其实是追加一个值一并生成hash。
由于我们不需要再追加值了,所以传入nil得到signByte的hash值。
补充:golang标准库-crypto/md5(md5加密算法)
本文讲解如何使用go封装好的md5算法,不深入剖析md5算法原理。
首先我们要知道md5算法属于hash算法的一种,所以在了解md5之前,我们先认识一下go提供的hash接口。hash算法是保证只要输入的值不同,就一定会得到两个不同的指定长度的hash值。
当前两个不同值产生相同的hash还是有可能的,只是这个可能性很小很小
先认识go的hash接口(位于go标准库-hash包):
type Hash interface { // 通过io.Writer接口的Write方法向hash中添加数据 io.Writer // 返回添加b到当前的hash值后的新切片,不会改变底层的hash状态,这个方法就是返回计算后的hash值,只是它是字符切片 Sum(b []byte) []byte // 重设hash为无数据输入的状态,就是清空hash之前写入的数据 Reset() // 返回Sum会返回的切片的长度 Size() int // 返回hash底层的块大小;Write方法可以接受任何大小的数据, // 但提供的数据是块大小的倍数时效率更高 BlockSize() int }
crypto/md5包实现的就是这个Hash接口。
Hash包还有两个Hash接口:
type Hash32 interface { // Hash32是一个被所有32位hash函数实现的公共接口。 Hash Sum32() uint32 } type Hash64 interface { // Hash64是一个被所有64位hash函数实现的公共接口。 Hash Sum64() uint64 }
md5实现的第一个Hash接口是16位的hash函数(它的Sum方法返回的字符切片长度为16位),Hash32和hash64是属于安全性更高的两个Hash函数,产生的hash值也更长。
下面来看md5算法:
crypto/md5包提供了一个方法创建md5算法:
func New() hash.Hash => 返回一个新的使用MD5校验的hash.Hash接口
接着看示例:
package main import ( "crypto/md5" "encoding/hex" "fmt" ) func main() { has := md5.New() // 创建md5算法 has.Write([]byte("abc123")) // 写入需要加密的数据 b := has.Sum(nil) // 获取hash值字符切片;Sum函数接受一个字符切片,这个切片的内容会原样的追加到abc123加密后的hash值的前面,这里我们不需要这么做,所以传入nil fmt.Println(b) // 打印一下 [233 154 24 196 40 203 56 213 242 96 133 54 120 146 46 3] // 上面可以看到加密后的数据为长度为16位的字符切片,一般我们会把它转为16进制,方便存储和传播,下一步转换16进制 fmt.Println(hex.EncodeToString(b)) // 通过hex包的EncodeToString函数,将数据转为16进制字符串; 打印 e99a18c428cb38d5f260853678922e03 // 还有一种方法转换为16进制,通过fmt的格式化打印方法, %x表示转换为16进制 fmt.Printf("%x",b) // 打印 e99a18c428cb38d5f260853678922e03 }
运行结果:
crypto/md5包还提供了一个md5加密简便的方法:
func Sum(data []byte) [Size]byte => 直接返回数据data的MD5加密值,注意它返回的是指定大小(Size)的数组,而不是切片了
下面看例子:
package main import ( "crypto/md5" "fmt" ) func main() { b := md5.Sum([]byte("abc123")) // 加密数据 fmt.Printf("%x",b) // 转换为16进制,并打印 }
运行结果:
这二种方法都可以md5加密数据,甚至后面更加简洁。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 群星《赤热 电视剧音乐原声》[320K/MP3][427.21MB]
- 周华健.1996-爱的光【滚石】【WAV+CUE】
- 杨宗宪.1996-想啥人怨啥人等啥人【有容唱片】【WAV+CUE】
- 郑秀文.2024-Best.Concert.Live【华纳】【FLAC分轨】
- 《Pax Dei》配置要求一览
- 《过山车之心2》存档位置介绍
- 《三国志8 REMAKE》评测:自定义的三国演义
- 群星《少年白马醉春风 网剧OST原声专辑》[320K/MP3][117.05MB]
- 群星《少年白马醉春风 网剧OST原声专辑》[FLAC/分轨][621.04MB]
- 《魏佳艺5CD合集》[WAV分轨][3.8G]
- CSGO职业选手donk怎么样 2024最新donk个人资料介绍
- CSGO职业选手NiKo怎么样 2024最新Niko个人资料介绍
- 剑网3丝路风语PVE焚影怎么打 丝路风语PVE焚影圣诀手法配装攻略
- [老虎魚古典名盘]心碎SACD浪漫小提琴之声[DSF]
- Queen(皇后乐队)《GreatestHitsII》[SACD-DSF]