go语言各种hash哈希算法使用汇总(超详细代码)

目录

前言

一、首先以md4为例

(一)16进制字符串的md4

(二)字符串的md4

(三)16进制字符串、字符串封装

二、md4、md5、sha1、ripemd160、sha256、sha512

(一)导包

(二)单个使用

(三)md4、md5、sha1、ripemd160、sha256、sha512封装

三、两次sha256

(一)返回两次哈希256后字节数组

(二)返回两次哈希256后字符串


前言

  • 消息摘要,包括MD4、MD5(128位)、SHA-1、ripeMD160、SHA-224、SHA-256、SHA-384、SHA-512、SHA-3(Keccak算法,512、384、256、224)

  • 一个优秀hash算法

    • 正向快速

    • 逆向困难

    • 输入敏感

    • 抗冲突(抗碰撞)

  • 用户密码加Salt(盐)后哈希保存,增加破解难度

    • 例:密码:“123”,哈希前修改为:"123aabbcc"等。

一、首先以md4为例

(一)16进制字符串的md4

        1、"5A24"=>0x5A24。

arr, _ := hex.DecodeString("5A24")

        2、完整代码:

// 参数为16进制字符串(必须偶数个,两位16进制为1个字节)
func MD4HexString(text string) string {
	var hashInstance hash.Hash       // 定义哈希实例
	hashInstance = md4.New()         // 实例赋值 "golang.org/x/crypto/md4"
	arr, _ := hex.DecodeString(text) // 十六进制字符串转为十六进制字节数组
	hashInstance.Write(arr)          // 写入哈希实例对象
	bytes := hashInstance.Sum(nil)   // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组
	return fmt.Sprintf("%x", bytes)  // 格式化输出哈希值
}

(二)字符串的md4

        1、将字符串转换为字节数组

arr := []byte("字符串")

        2、完整代码

// 参数为字符串
func MD4String(text string) string {
	var hashInstance hash.Hash      // 定义哈希实例
	hashInstance = md4.New()        // 实例赋值 "golang.org/x/crypto/md4"
	arr := []byte(text)             // 十六进制字符串转为十六进制字节数组
	hashInstance.Write(arr)         // 写入哈希实例对象
	bytes := hashInstance.Sum(nil)  // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组
	return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}

(三)16进制字符串、字符串封装

  • 封装(一)、(二)
// 16进制字符串哈希:
// 第1个参数为16进制字符串(必须偶数个)时,第2个参数为:true。
// 字符串哈希:
// 第1个参数为字符串时,第2个参数为:false。
func MD4(text string, isHex bool) string {
	var hashInstance hash.Hash // 定义哈希实例
	hashInstance = md4.New()   // 实例赋值
	if isHex {
		arr, _ := hex.DecodeString(text) // 16进制字符串转为16进制字节数组
		hashInstance.Write(arr)          // 写入哈希实例对象
	} else {
		hashInstance.Write([]byte(text)) // 将字符串转换为字节数组,写入哈希对象
	}
	bytes := hashInstance.Sum(nil)  // 哈希值追加到参数后面,只获取原始值,不用追加,用nil,返回哈希值字节数组
	return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}

二、md4、md5、sha1、ripemd160、sha256、sha512

(一)导包

  • 根据具体需求的算法进行导包。
import (
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"encoding/hex"
	"fmt"
	"hash"

	"golang.org/x/crypto/md4"
	"golang.org/x/crypto/ripemd160"
)

(二)单个使用

  • 举一反三,根据md4的使用,我们可以将代码简单的修改以实现其他哈希算法。
  • 只需要将md4代码中的一句代码按照需求进行修改即可完成,不要忘记导包:
hashInstance = md4.New()   // md4
hashInstance = md5.New()         // md5
hashInstance = sha1.New()        // sha1
hashInstance = ripemd160.New()   // ripemd160
hashInstance = sha256.New()      // sha256
hashInstance = sha512.New()      // sha512

(三)md4、md5、sha1、ripemd160、sha256、sha512封装

// 根据不同哈希类型进行哈希:md4、md5、sha1、ripemd160、sha256、sha512
func HASH(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) // 格式化输出哈希值
}

(四)使用crypto.Hash简化代码

func HASH(text string, myhash crypto.Hash, isHex bool) string {
	var hashInstance hash.Hash // 定义哈希实例
	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) // 格式化输出哈希值
}

三、两次sha256

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

(一)返回两次哈希256后字节数组

// 两次哈希256后的字节数组,第二次是将第一次哈希后的16进制进行哈希
func SHA256Double(text string, isHex bool) []byte {
	hashInstance := sha256.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 bytes
}

(二)返回两次哈希256后字符串

// 两次哈希256后的哈希字符串,第二次是将第一次哈希后的16进制进行哈希
func SHA256DoubleString(text string, isHex bool) string {
	return fmt.Sprintf("%x", SHA256Double(text, isHex))
}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MurmurHash 哈希算法是一种高效、简单的哈希算法,主要应用于散列表的实现。它通过对输入的数据进行多次运算,得到一个固定长度的散列值。 MurmurHash3 第三版哈希算法是 MurmurHash 的升级版本,与原版本相比,具有更高的散列精度和更优秀的碰撞处理能力。同时,它还支持 128 位散列值,可以更好地防止碰撞。 ### 回答2: MurmurHash是一种非加密的哈希算法,它能够将任意长度的数据映射为固定长度的哈希值。它被设计成快速且高效的哈希函数,适用于一些需要快速哈希计算的场景,如哈希表等。 MurmurHash3是MurmurHash系列的第三个版本,相较于之前的版本,有一些改进和优化。MurmurHash3具有良好的分散性和性能,适用于一些需要高速计算的应用场景。 MurmurHash3除了能够生成32位和128位的哈希值,还支持通过seed参数来对结果进行定制化控制。这意味着具有相同的输入数据和相同的seed参数,将得到相同的结果。MurmurHash3还支持并行处理,可以同时计算多个哈希值,提高了计算速度。 MurmurHash3相较于之前的版本,修复了一些潜在的安全漏洞,提供了更好的健壮性。同时,MurmurHash3对于输入数据的大小没有限制,其计算速度基本稳定不受输入数据长度影响。 总之,MurmurHash算法及其第三版MurmurHash3是一种高速、高效的哈希算法,常用于对数据进行快速哈希计算。它在分散性、性能和安全性上都有一定的优势,并且支持定制化控制和并行计算。 ### 回答3: MurmurHash是一种快速非加密的哈希算法,主要用于哈希表、散列索引和数据查找等应用中。它是由Austin Appleby在2008年提出的,发展成了多个版本,其中包括MurmurHash2和MurmurHash3。 MurmurHash3是MurmurHash系列中的第三版,相比于前两个版本,它有更高的哈希效率和更低的冲突率。MurmurHash3可以计算32位或128位哈希值,具体选择哪个取决于具体的应用需求。 MurmurHash3的实现包括一些变种,主要分为32位和128位两种。32位的MurmurHash3适用于一般的哈希算法需求,它使用了一些位运算和一系列常数来生成哈希值。而128位的MurmurHash3更加适用于对安全性要求较高的场景,它通过增加更多的变换步骤和混淆运算,并使用64位整数来计算哈希值。 MurmurHash3相比于前两个版本具有更好的分布性和更低的冲突率,这使得它在哈希表、哈希集等数据结构中表现更优秀。同时,MurmurHash3的计算速度也非常快速,适合用于对大量数据进行哈希运算的场景。 总的来说,MurmurHash和MurmurHash3都是高效的哈希算法,能够快速计算出哈希值。不同版本的MurmurHash有一些差异,MurmurHash3通过进一步改进和优化,提供了更好的分布性和更低的冲突率,适用于不同的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值