Golang的md5 hash计算操作
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Golang的md5 hash计算操作》,聊聊MD5、hash,我们一起来看看吧!
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加密数据,甚至后面更加简洁。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。
终于介绍完啦!小伙伴们,这篇关于《Golang的md5 hash计算操作》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
浅谈Golang的方法传递值应该注意的地方
- 上一篇
- 浅谈Golang的方法传递值应该注意的地方
- 下一篇
- golang gin 框架 异步同步 goroutine 并发操作
-
- Golang · Go教程 | 5小时前 | 格式化输出 printf fmt库 格式化动词 Stringer接口
- Golangfmt库用法与格式化技巧解析
- 140浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang配置Protobuf安装教程
- 147浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang中介者模式实现与通信解耦技巧
- 378浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang多协程通信技巧分享
- 255浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Golang如何判断变量类型?
- 393浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Golang云原生微服务实战教程
- 310浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Golang迭代器与懒加载结合应用
- 110浏览 收藏
-
- Golang · Go教程 | 7小时前 | 性能优化 并发安全 Golangslicemap 预设容量 指针拷贝
- Golangslicemap优化技巧分享
- 412浏览 收藏
-
- Golang · Go教程 | 7小时前 |
- Golang代理模式与访问控制实现解析
- 423浏览 收藏
-
- Golang · Go教程 | 7小时前 |
- Golang事件管理模块实现教程
- 274浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3166次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3378次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3407次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4511次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3787次使用
-
- golang中字符串MD5生成方式总结
- 2023-01-23 146浏览
-
- redis删除hash的实现方式
- 2023-02-25 228浏览
-
- Golang 获取文件md5校验的方法以及效率对比
- 2023-01-07 313浏览
-
- go与php的md5功能,加密后不一致问题
- 2023-01-08 234浏览
-
- 干涉MySQL优化器使用hash join的方法
- 2022-12-29 232浏览

