Go语言实现各种hash算法

Go语言实现各种hash算法

1、各种hash算法的实现

package mainimport ("crypto""crypto/md5""crypto/sha1""crypto/sha256""crypto/sha512""encoding/hex""fmt""hash""golang.org/x/crypto/md4""golang.org/x/crypto/ripemd160"
)func main() {str1 := HashByType("Hello World", "md4", false)fmt.Println(str1)str2 := HashByCrypto("Hello World", crypto.MD4, false)fmt.Println(str2)
}// 根据不同哈希类型进行哈希: md4、md5、sha1、ripemd160、sha256、sha512
func HashByType(text string, hashType string, isHex bool) string {var hashInstance hash.Hash // 定义哈希实例switch hashType {          // 选择哈希类型case "md4":hashInstance = md4.New() // "golang.org/x/crypto/md4"case "md5":hashInstance = md5.New()case "sha1":hashInstance = sha1.New()case "ripemd160":hashInstance = ripemd160.New() // "golang.org/x/crypto/ripemd160"case "sha256":hashInstance = sha256.New()case "sha512":hashInstance = sha512.New()}if isHex {arr, _ := hex.DecodeString(text) // 十六进制字符串转为十六进制字节数组hashInstance.Write(arr)          // 写入哈希实例对象} else {hashInstance.Write([]byte(text)) // 将字符串转换为字节数组,写入哈希对象}bytes := hashInstance.Sum(nil)  // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}// 根据不同哈希类型进行哈希: md4、md5、sha1、ripemd160、sha256、sha512
func HashByCrypto(text string, myhash crypto.Hash, isHex bool) string {hashInstance := myhash.New() // 定义哈希实例if isHex {arr, _ := hex.DecodeString(text) // 十六进制字符串转为十六进制字节数组hashInstance.Write(arr)          // 写入哈希实例对象} else {hashInstance.Write([]byte(text)) // 将字符串转换为字节数组,写入哈希对象}bytes := hashInstance.Sum(nil)  // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}

支持的Hash算法有:

const (MD4         Hash = 1 + iota // import golang.org/x/crypto/md4MD5                         // import crypto/md5SHA1                        // import crypto/sha1SHA224                      // import crypto/sha256SHA256                      // import crypto/sha256SHA384                      // import crypto/sha512SHA512                      // import crypto/sha512MD5SHA1                     // no implementation; MD5+SHA1 used for TLS RSARIPEMD160                   // import golang.org/x/crypto/ripemd160SHA3_224                    // import golang.org/x/crypto/sha3SHA3_256                    // import golang.org/x/crypto/sha3SHA3_384                    // import golang.org/x/crypto/sha3SHA3_512                    // import golang.org/x/crypto/sha3SHA512_224                  // import crypto/sha512SHA512_256                  // import crypto/sha512BLAKE2s_256                 // import golang.org/x/crypto/blake2sBLAKE2b_256                 // import golang.org/x/crypto/blake2bBLAKE2b_384                 // import golang.org/x/crypto/blake2bBLAKE2b_512                 // import golang.org/x/crypto/blake2bmaxHash
)

2、两次hash

  • 有连续两次哈希需求时,为了不重复创建哈希对象,造成内存的浪费,可以单独封装函数。
  • 哈希完成一次后,使用以下语句,清除哈希对象内容,然后进行第二次哈希。
hashInstance.Reset() // 重置哈希实例

完整代码:

package mainimport ("crypto""crypto/md5""crypto/sha1""crypto/sha256""crypto/sha512""encoding/hex""fmt""hash""golang.org/x/crypto/md4""golang.org/x/crypto/ripemd160"
)func main() {str1 := HashByType("Hello World", "md4", false)fmt.Println(str1)str2 := HashByCrypto("Hello World", crypto.MD4, false)fmt.Println(str2)str3 := DoubleHashByCrypto("Hello World", crypto.MD4, false)fmt.Println(str3)
}// 根据不同哈希类型进行哈希: md4、md5、sha1、ripemd160、sha256、sha512
func HashByType(text string, hashType string, isHex bool) string {var hashInstance hash.Hash // 定义哈希实例switch hashType {          // 选择哈希类型case "md4":hashInstance = md4.New() // "golang.org/x/crypto/md4"case "md5":hashInstance = md5.New()case "sha1":hashInstance = sha1.New()case "ripemd160":hashInstance = ripemd160.New() // "golang.org/x/crypto/ripemd160"case "sha256":hashInstance = sha256.New()case "sha512":hashInstance = sha512.New()}if isHex {arr, _ := hex.DecodeString(text) // 十六进制字符串转为十六进制字节数组hashInstance.Write(arr)          // 写入哈希实例对象} else {hashInstance.Write([]byte(text)) // 将字符串转换为字节数组,写入哈希对象}bytes := hashInstance.Sum(nil)  // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}// 根据不同哈希类型进行哈希: md4、md5、sha1、ripemd160、sha256、sha512
func HashByCrypto(text string, myhash crypto.Hash, isHex bool) string {hashInstance := myhash.New() // 定义哈希实例if isHex {arr, _ := hex.DecodeString(text) // 十六进制字符串转为十六进制字节数组hashInstance.Write(arr)          // 写入哈希实例对象} else {hashInstance.Write([]byte(text)) // 将字符串转换为字节数组,写入哈希对象}bytes := hashInstance.Sum(nil)  // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}// 根据不同哈希类型进行哈希: md4、md5、sha1、ripemd160、sha256、sha512
// 两次哈希256后的字节数组,第二次是将第一次哈希后的16进制进行哈希
func DoubleHashByCrypto(text string, myhash crypto.Hash, isHex bool) string {hashInstance := myhash.New() // 定义哈希实例if isHex {arr, _ := hex.DecodeString(text) // 十六进制字符串转为十六进制字节数组hashInstance.Write(arr)          // 写入哈希实例对象} else {hashInstance.Write([]byte(text)) // 将字符串转换为字节数组,写入哈希对象}bytes := hashInstance.Sum(nil) // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组hashInstance.Reset()hashInstance.Write(bytes)bytes = hashInstance.Sum(nil)return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}
# 输出
77a781b995cf1cfaf39d9e2f5910c2cf
77a781b995cf1cfaf39d9e2f5910c2cf
487b5e8e42dcd5b4cc218c2e275561fb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

补充前端访问静态资源的一个错误

注意,前端访问时带上本地服务端的host,例如http://localhost:8080, 后端改写的代码如下,注意file后面一定是三个‘/’,不然的化虽然能解析,但访问不到。 Configuration public class LocalPathWebMvcConfigurer exte…

C++ 具名要求-全库范围的概念 -包含分配信息的类类型(Allocator)

此页面中列出的具名要求,是 C 标准的规范性文本中使用的具名要求,用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…

LeetCode264. 丑数 II(相关话题:多重指针动态规划)

题目描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1: 输入:n 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2&am…

【Sharding-Sphere 整合SpringBoot】

Sharding-Jdbc在3.0后改名为Sharding-Sphere。Sharding-Sphere相关资料,请自行网上查阅,这里仅仅介绍了实战相关内容,算是抛砖引玉。 Sharding-Sphere 整合SpringBoot 一、项目准备二、项目实战1. pom.xml及application.yml2. OrderInfoCont…

串行Nor Flash的结构和参数特性

文章目录 引言1、Nor Flash的结构2、Nor Flash的类别3.标准Serial Nor Flash的特征属性1.Wide Range VCC Flash2.Permanent Lock3.Default Lock Protection4.Standard Serial Interface5.Multi-I/O6.Multi-I/O Duplex (DTR)7.XIP(片上执行) 4.标准Serial…

前端架构师需要具备哪些能力?

我们先看看前端架构师的招聘要求。 公司一 工作职责 1、参与项目需求分析评审,负责核心功能详细设计; 2、参与技术调研,负责解决开发过程中的技术难点问题; 3、协助制定前端开发规范,核心代码开发; 4、负…

Java内置锁:深度解析Lock接口中lock方法和lockInterruptibly方法

Java11中的Lock接口提供lock()和lockInterruptibly()两种锁定方法,用于获取锁,但处理线程中断时有所不同,lock()使线程等待直到锁释放,期间无视中断;而lockInterruptibly()在等待中若收到中断请求,会立即响…

倍福PLC控制器开发环境介绍

倍福PLC控制器是一款功能强大、易于使用的可编程逻辑控制器,广泛应用于各种工业自动化控制系统中。为了充分发挥倍福PLC控制器的功能,需要使用合适的开发环境。下面将介绍倍福PLC控制器的开发环境,主要包括软件安装与配置、工程创建与管理、编…

“超人练习法”系列08:ZPD 理论

01 先认识一个靓仔 看过 Lev Vygotsky 这个人的书吗?他是一位熟练心理学家,对人们习得技能的方式非常感兴趣,但他 37 岁的时候就因肺炎英年早逝了。 他认为社会环境对学习有关键性的作用,认为社会因素与个人因素的整合促成了学习…

MySQL修改登录密码

适用于可以登录进入mysql数据库,想修改密码或者提示密码过期 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement 如果忘记密码可以看Linux系统MySQL忘记登录密码-CSDN博客这篇文章 方法一&#xff…

element ui el-table展示列表,结合分页+过滤功能

vueelement-ui实现的列表展示&#xff0c;列表分页&#xff0c;列表筛选功能 1&#xff0c;分页器 el-table模块下面是分页器代码 <el-pagination></el-pagination> <el-table></el-table> <!-- 分页器 --><div class"block" st…

力扣每日一练(24-1-13)

如果用列表生成式&#xff0c;可以满足输出的型式&#xff0c;但是不满足题意&#xff1a; nums[:] [i for i in nums if i ! val]return len(nums) 题意要求是&#xff1a; 你需要原地修改数组&#xff0c;并且只使用O(1)的额外空间。这意味着我们不能创建新的列表&#xff…

【QT】标准对话框

目录 1 概述 2 QFileDialog对话框 1.选择打开一个文件 2.选择打开多个文件 3&#xff0e;选择已有目录 4&#xff0e;选择保存文件名 3 QColorDialog对话框 4 QFontDialog对话框 5 QInputDialog标准输入对话框 1.输入文字 2&#xff0e;输入整数 3&#xff0e;输入…

Python教程(23)——Python类中常用的特殊成员

在Python中&#xff0c;类特殊成员是指以双下划线开头和结尾的属性和方法&#xff0c;也被称为魔术方法&#xff08;Magic methods&#xff09;或特殊方法&#xff08;Special methods&#xff09;。这些特殊成员在类的定义中具有特殊的语法和功能&#xff0c;用于实现对象的特…

【PlantUML】-类图-布局,如何改变元素位置

写在前面 PlantUML属于自动布局。掌握好&#xff0c;是一件利器&#xff0c;掌握不好&#xff0c;就会不知其所以然。尤其在布局方面&#xff0c;因为它的布局可能会和你想的不太一样。本篇文章以例子为基础&#xff0c;简单地说几个在实际应用过程中摸索出来的原则。相信看完这…

【猫头虎分享】全面揭秘鸿蒙4.0:华为的技术革新与市场影响

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

逆变器3前级推免(高频变压器)

一节电池标压是在2.8V—4.2V之间&#xff0c;所以24V电压需要大概七节电池串联。七节电池电压大概在19.6V—29.4V之间。 从24V的电池逆变到到220V需要升压的过程。那么我们具体需要升压到多少&#xff1f; 市电AC220V是有效值电压&#xff0c;峰值电压是220V*1.414311V 如果…

ssm基于Javaweb的物流信息管理系统的设计与实现论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统物流信息管理难度大&#xff0c;容错率低&#xff0c;管理…

Unity的Camera类——视觉掌控与深度解析(下)

前言 欢迎阅读本篇博客&#xff0c;这章我们将深入探讨 Unity 游戏引擎中 Camera 类的委托和枚举。摄像机在游戏开发中扮演着关键角色&#xff0c;它不仅定义了玩家视角的窗口&#xff0c;还影响着游戏的视觉表达和整体体验。理解和正确使用 Camera 类的枚举和委托&#xff0c…

【mmseg】‘SegDataPreProcessor is not in the model registry问题解决

问题描述&#xff1a; 在使用mmseg的模型进行推理导出为torchscript时出错&#xff1a; KeyError: "class EncoderDecoder in mmseg/models/segmentors/encoder_decoder.py: SegDataPreProcessor is not in the model registry. Please check whether the value of SegDat…