Go语言实现各种hash算法
warning:
这篇文章距离上次修改已过202天,其中的内容可能已经有所变动。
以下是一个简单的Go语言示例,演示了如何实现MD5、SHA1和SHA256哈希算法。这些都是广泛使用的哈希函数,它们都属于哈希算法的一种,被广泛应用于加密场景。
package main
import (
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"fmt"
"hash"
"io"
"os"
)
// 定义一个接口,用于不同的哈希算法
type Hasher interface {
Hash(data []byte) []byte
}
// 定义MD5哈希结构体
type MD5Hasher struct{}
// 实现Hasher接口
func (h MD5Hasher) Hash(data []byte) []byte {
hash := md5.Sum(data)
return hash[:]
}
// 定义SHA1哈希结构体
type SHA1Hasher struct{}
// 实现Hasher接口
func (h SHA1Hasher) Hash(data []byte) []byte {
hash := sha1.Sum(data)
return hash[:]
}
// 定义SHA256哈希结构体
type SHA256Hasher struct{}
// 实现Hasher接口
func (h SHA256Hasher) Hash(data []byte) []byte {
hash := sha256.Sum256(data)
return hash[:]
}
// 通用的哈希函数,接受Hasher接口类型
func HashData(h Hasher, filename string) ([]byte, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
hash := h.New()
if _, err := io.Copy(hash, file); err != nil {
return nil, err
}
return hash.Sum(nil), nil
}
func main() {
data := []byte("example data")
md5Hash := MD5Hasher{}
sha1Hash := SHA1Hasher{}
sha256Hash := SHA256Hasher{}
fmt.Printf("MD5: %x\n", md5Hash.Hash(data))
fmt.Printf("SHA1: %x\n", sha1Hash.Hash(data))
fmt.Printf("SHA256: %x\n", sha256Hash.Hash(data))
// 使用crypto包中的Hash接口和方法
h := md5.New()
h.Write(data)
fmt.Printf("MD5 with crypto package: %x\n", h.Sum(nil))
}
这段代码首先定义了一个Hasher
接口,以及实现了该接口的MD5Hasher
、SHA1Hasher
和SHA256Hasher
结构体。它还提供了一个HashData
函数,该函数接受Hasher
接口类型参数,并对文件内容进行哈希计算。在main
函数中,我们展示了如何使用这些结构体和函数来计算给定数据的哈希值。
评论已关闭