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

导入方式:

  1. import "hash"

hash包提供hash函数的接口。

type Hash

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

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

sha256包中有一个方法:

func New

  1. func New() hash.Hash

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

举例:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "crypto/sha256"
  6. "log"
  7. "encoding"
  8. "bytes"
  9. )
  10.  
  11. func main() {
  12. const (
  13. input1 = "The tunneling gopher digs downwards, "
  14. input2 = "unaware of what he will find."
  15. )
  16.  
  17. first := sha256.New()
  18. first.Write([]byte(input1))
  19.  
  20. marshaler, ok := first.(encoding.BinaryMarshaler) //类型断言
  21. if !ok {
  22. log.Fatal("first does not implement encoding.BinaryMarshaler")
  23. }
  24. state, err := marshaler.MarshalBinary() //将其编码成二进制形式
  25. if err != nil {
  26. log.Fatal("unable to marshal hash:", err)
  27. }
  28.  
  29. second := sha256.New()
  30.  
  31. unmarshaler, ok := second.(encoding.BinaryUnmarshaler)
  32. if !ok {
  33. log.Fatal("second does not implement encoding.BinaryUnmarshaler")
  34. }
  35. if err := unmarshaler.UnmarshalBinary(state); err != nil {//将上面生成的二进制形式的state解码成input1的值,并写到unmarshaler中,这样second中也有input1了
  36. log.Fatal("unable to unmarshal hash:", err)
  37. }
  38.  
  39. first.Write([]byte(input2))
  40. second.Write([]byte(input2))
  41.  
  42. fmt.Printf("%x\n", first.Sum(nil))//57d51a066f3a39942649cd9a76c77e97ceab246756ff3888659e6aa5a07f4a52
  43. fmt.Println(bytes.Equal(first.Sum(nil), second.Sum(nil))) //true
  44. }

type Hash32

  1. type Hash32 interface {
  2. Hash
  3. Sum32() uint32
  4. }

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

type Hash64

  1. type Hash64 interface {
  2. Hash
  3. Sum64() uint64
  4. }

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

go标准库的学习-hash的更多相关文章

  1. go标准库的学习-crypto/md5

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...

  2. go标准库的学习-crypto/sha1

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...

  3. go标准库的学习-crypto/sha256

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...

  4. go标准库的学习-net/http

    参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...

  5. go标准库的学习-database/sql

    参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...

  6. python 标准库基础学习之开发工具部分1学习

    #2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...

  7. python calendar标准库基础学习

    # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

  8. 《C标准库》学习笔记整理

    简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ...

  9. python linecache标准库基础学习

    #python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...

随机推荐

  1. [转]微擎人人商城m()函数调用model方法

    本文转自:http://yangjunwei.com/a/3177.html 微擎人人商城p()函数可内部调用任意插件的函数 http://yangjunwei.com/a/3216.html

  2. java中import static和import的区别【转】

    转自:http://blog.csdn.net/ygc87/article/details/7371254

  3. docker swarm 搭建及跨主机网络互连案例分析

    准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...

  4. 初学HTML-7

    表单中的一些标签 label标签:让文字和输入框进行绑定,即,点击文字,输入框可以开始输入(默认文字和输入框没有关系,不会聚焦) 格式:<form action=""> ...

  5. NoHttp封装--01

    NoHttpActivity public class NoHttpActivity extends Activity implements View.OnClickListener { privat ...

  6. Ubuntu18.04 安装mysql8.0.11

    1.下载deb包 2.运行命令 sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb sudo apt update 3.安装mysql8 sudo apt i ...

  7. 利用奇异值分解(SVD)进行图像压缩-python实现

    首先要声明,图片的算法有很多,如JPEG算法,SVD对图片的压缩可能并不是最佳选择,这里主要说明SVD可以降维 相对于PAC(主成分分析),SVD(奇异值分解)对数据的列和行都进行了降维,左奇异矩阵可 ...

  8. JVM内核优化

    1.垃圾回收器 JVM垃圾回收器有串行和并行两种. 1.1 Serial收集器(串行,单线程),现在使用较少 Serial一般收集新生代 SerialOld一般收集老年代(采用标记压缩算法) 1.2 ...

  9. 【redis专题(3)】命令语法介绍之link

    通过链表结构可以模仿队列结构与堆栈结构:关于队列结构和堆栈结构可以查看https://www.zybuluo.com/a5635268/note/290475 增 lpush key value1 v ...

  10. [20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt

    [20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt --//上午翻看以前我的发的帖子,发现链接:http://www.itpub.net/thread-2066758- ...