• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go标准库的学习-hash

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

参考:https://studygolang.com/pkgdoc

导入方式:

import "hash"

hash包提供hash函数的接口。

 

 Hash

type Hash interface {
    // 通过嵌入的匿名io.Writer接口的Write方法向hash中添加更多数据,永远不返回错误
    io.Writer
    // 返回添加b到当前的hash值后的新切片,不会改变底层的hash状态
    Sum(b []byte) []byte
    // 重设hash为无数据输入的状态
    Reset()
    // 返回Sum会返回的切片的长度
    Size() int
    // 返回hash底层的块大小;Write方法可以接受任何大小的数据,
    // 但提供的数据是块大小的倍数时效率更高
    BlockSize() int
}

Hash是一个被所有hash函数实现的公共接口。

sha256包中有一个方法:

 New

func New() hash.Hash

返回一个新的使用SHA256校验算法的hash.Hash接口。

举例:

package main

import (
    "fmt"
    "crypto/sha256"
    "log"
    "encoding"
    "bytes"
)

func main() {
    const (
        input1 = "The tunneling gopher digs downwards, "
        input2 = "unaware of what he will find."
    )

    first := sha256.New()
    first.Write([]byte(input1))

    marshaler, ok := first.(encoding.BinaryMarshaler) //类型断言
    if !ok {
        log.Fatal("first does not implement encoding.BinaryMarshaler")
    }
    state, err := marshaler.MarshalBinary() //将其编码成二进制形式
    if err != nil {
        log.Fatal("unable to marshal hash:", err)
    }

    second := sha256.New()

    unmarshaler, ok := second.(encoding.BinaryUnmarshaler)
    if !ok {
        log.Fatal("second does not implement encoding.BinaryUnmarshaler")
    }
    if err := unmarshaler.UnmarshalBinary(state); err != nil {//将上面生成的二进制形式的state解码成input1的值,并写到unmarshaler中,这样second中也有input1了
        log.Fatal("unable to unmarshal hash:", err)
    }

    first.Write([]byte(input2))
    second.Write([]byte(input2))

    fmt.Printf("%x\n", first.Sum(nil))//57d51a066f3a39942649cd9a76c77e97ceab246756ff3888659e6aa5a07f4a52
    fmt.Println(bytes.Equal(first.Sum(nil), second.Sum(nil))) //true
}

 

 Hash32

type Hash32 interface {
    Hash
    Sum32() uint32
}

Hash32是一个被所有32位hash函数实现的公共接口。

 Hash64

type Hash64 interface {
    Hash
    Sum64() uint64
}

Hash64是一个被所有64位hash函数实现的公共接口。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
GO语言常量和变量发布时间:2022-07-10
下一篇:
go语言之进阶篇结构体指针类型匿名字段发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap