Golang的md5 hash计算操作

 更新时间:2020年12月19日 16:18:29   作者:piperck  
这篇文章主要介绍了Golang的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加密数据,甚至后面更加简洁。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • GO语言基础之数组

    GO语言基础之数组

    或许您是从其他语言转到GO语言这边的,那麽在其他语言的影响下您可能会不太适应GO语言的数组,因为GO语言把数组给拆分成了array,slice和map,需要的朋友可以参考下
    2015-01-01
  • 深入了解Go语言中database/sql是如何设计的

    深入了解Go语言中database/sql是如何设计的

    在 Go 语言中内置了 database/sql 包,它只对外暴露了一套统一的编程接口,便可以操作不同数据库,那么database/sql 是如何设计的呢,下面就来和大家简单聊聊吧
    2023-07-07
  • Golang使用cobra实现命令行程序的示例代码

    Golang使用cobra实现命令行程序的示例代码

    Cobra 是 Go 语言中一个强大的命令行应用库,它提供了创建命令行工具所需的基本结构和功能,被许多开发者用于构建各种命令行工具和应用程序,本文将给大家介绍Golang使用cobra实现命令行程序,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • GO 语言运行环境的基础知识

    GO 语言运行环境的基础知识

    这篇文章主要介绍了GO 语言运行环境的基础知识的相关资料,需要的朋友可以参考下
    2022-09-09
  • Go语言中io.Reader和io.Writer的详解与实现

    Go语言中io.Reader和io.Writer的详解与实现

    在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心。在使用Go语言的过程中,无论你是实现web应用程序,还是控制台输入输出,又或者是网络操作,不可避免的会遇到IO操作,使用到io.Reader和io.Writer接口。下面来详细看看。
    2016-09-09
  • Golang使用gorm实现分页功能的示例代码

    Golang使用gorm实现分页功能的示例代码

    在提供列表接口时一般要用到分页,对于存储在某些数据库中的数据进行分页起来非常的方便,下文给出一个通过gorm进行分页并通过http返回数据的例子,感兴趣的小伙帮跟着小编一起来看看吧
    2024-10-10
  • golang 如何通过反射创建新对象

    golang 如何通过反射创建新对象

    这篇文章主要介绍了golang 通过反射创建新对象的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go依赖注入工具wire的具体使用

    Go依赖注入工具wire的具体使用

    本文主要介绍了Go依赖注入工具wire的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Go在GoLand中引用github.com中的第三方包具体步骤

    Go在GoLand中引用github.com中的第三方包具体步骤

    这篇文章主要给大家介绍了关于Go在GoLand中引用github.com中第三方包的具体步骤,文中通过图文介绍的非常详细,对大家学习或者使用Go具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • 详解Go hash算法的支持

    详解Go hash算法的支持

    这篇文章主要介绍了详解Go hash算法的支持,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论