注册 登录

清河洛

Go中常见哈希值获取

qingheluo2024-07-09清河洛187
常见的哈希值(也称为消息摘要或数字摘要)算法有md5、sha1、sha256、sha512等,广泛应用于密码学和信息安全领域主要原理就是接收任意长度的数据输入,并输出固定长度的摘要值,通常用于验证数据的完整性和唯一性在Go的官方标准库中 "crypto/md5" 实现了md5 "crypto/sha1" 实现了sha1 "crypto/sha256" 实现了sha224和sha256 "crypto/sha512" 实现了sha384和sha512 其同属于一个crypto包,每个包导出的方法和使用完全相同,简单来讲有两个方法 Sum(data []byte) [siz...

常见的哈希值(也称为消息摘要或数字摘要)算法有md5、sha1、sha256、sha512等,广泛应用于密码学和信息安全领域

主要原理就是接收任意长度的数据输入,并输出固定长度的摘要值,通常用于验证数据的完整性和唯一性

在Go的官方标准库中

"crypto/md5"     实现了md5
"crypto/sha1"    实现了sha1
"crypto/sha256"  实现了sha224和sha256
"crypto/sha512"  实现了sha384和sha512

其同属于一个crypto包,每个包导出的方法和使用完全相同,简单来讲有两个方法

Sum(data []byte) [size]byte
    返回数据data的哈希值
    由于每种算法的最终哈希值结果位数是固定的,所以size表示对应算法的位数

New() hash.Hash
    创建一个hash.Hash对象,该对象实现了io.Writer,用于写入要计算的数据
    写入数据完成后使用hash.Hash对象的Sum(b []byte) []byte计算哈希值
        其中b为在计算时要追加的数据,不需要追加时传入nil即可

最后将计算的结果转换为16进制即可获取我们常见的字符串格式的哈希值

方式一:直接使用fmt.Printf()或fmt.Sprintf()
    使用%x作为占位符即可输出16进制字符串
    fmt.Prinff("%x",data)

方式二:使用"encoding/hex"包的EncodeToString(src []byte) string
    import "encoding/hex"
    hex.EncodeToString(data)

由于存在一个包中包含多种算法,如"crypto/sha512"包实现了sha384和sha512,所以在导出的方法名称上有所不同

下面简单罗列以下各包的导出Sum()方法和New()方法

md5.Sum(data []byte) [16]byte
md5.New() hash.Hash

sha1.Sum(data []byte) [20]byte
sha1.New() hash.Hash

// sha224
sha256.Sum224(data []byte) [28]byte
sha256.New224() hash.Hash

// sha256
sha256.Sum(data []byte) [32]byte
sha256.New() hash.Hash

// sha384
sha512.Sum384(data []byte) [48]byte
sha512.New384() hash.Hash

// sha512
sha512.Sum512(data []byte) [64]byte
sha512.New() hash.Hash

在日常开发中,一般的字符串我们直接使用Sum()方法获取哈希值,很多时候我们需要获取文件的哈希值,此时我们有两种方式来回去文件的哈希值

方式一:一次性读取文件所有数据后运行Sum()方法

file,err := os.Open(filename)
file_info := file.Start()
file_size := file_info.Size()
var cont make ([]byte,file_size)
_,err := file.Read(cont)
data := sha512.Sum512(cont)

方式二:创建hash.Hash

sha := sha512.New()
file,err := os.Open(filename)
_, err := io.Copy(sha, file)
data := sha.Sum(nil)

显然,在处理文件特别是比较大的文件时,方式二更加的优雅和效率



网址导航