Golang标准库——hash

DevilRoshan · · 1354 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

hash

hash包提供hash函数的接口。

type 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函数实现的公共接口。

type Hash32

type Hash32 interface {
    Hash
    Sum32() uint32
}

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

type Hash64

type Hash64 interface {
    Hash
    Sum64() uint64
}

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

  • adler32
  • crc32
  • crc64
  • fnv

adler32

adler32包实现了Adler-32校验和算法,参见RFC 1950

Adler-32由两个每字节累积的和组成:
s1是所有字节的累积,s2是所有s1的累积。两个累积值都取65521的余数。s1初始为1,s2初始为0。
Afler-32校验和保存为s2*65536 + s1。(最高有效字节在前/大端在前)

Constants

const Size = 4

Adler-32校验和的字节数。

func Checksum

func Checksum(data []byte) uint32

返回数据data的Adler-32校验和。

func New

func New() hash.Hash32

返回一个计算Adler-32校验和的hash.Hash32接口。

crc32

crc32包实现了32位循环冗余校验(CRC-32)的校验和算法,参见:

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

Constants

const (
    // 最常用的CRC-32多项式;用于以太网、v.42、fddi、gzip、zip、png、mpeg-2……
    IEEE = 0xedb88320
    // 卡斯塔尼奥利多项式,用在iSCSI;有比IEEE更好的错误探测特性
    // http://dx.doi.org/10.1109/26.231911
    Castagnoli = 0x82f63b78
    // 库普曼多项式;错误探测特性也比IEEE好
    // http://dx.doi.org/10.1109/DSN.2002.1028931
    Koopman = 0xeb31d82e
)

预定义的多项式。

const Size = 4

CRC-32校验和的字节长度。

Variables

var IEEETable = MakeTable(IEEE)

IEEETable是IEEE多项式对应的Table。

type Table

type Table [256]uint32

长度256的uint32切片,代表一个用于高效运作的多项式。

func MakeTable

func MakeTable(poly uint32) *Table

返回一个代表poly指定的多项式的Table。

func Checksum

func Checksum(data []byte, tab *Table) uint32

返回数据data使用tab代表的多项式计算出的CRC-32校验和。

func ChecksumIEEE

func ChecksumIEEE(data []byte) uint32

返回数据data使用IEEE多项式计算出的CRC-32校验和。

func Update

func Update(crc uint32, tab *Table, p []byte) uint32

返回将切片p的数据采用tab表示的多项式添加到crc之后计算出的新校验和。

func New

func New(tab *Table) hash.Hash32

创建一个使用tab代表的多项式计算CRC-32校验和的hash.Hash32接口。

func NewIEEE

func NewIEEE() hash.Hash32

创建一个使用IEEE多项式计算CRC-32校验和的hash.Hash32接口。

crc64

crc64包实现64位循环冗余校验或CRC-64校验和。 参见:

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

Constants

const (
    // ISO 3309定义的ISO多项式,用于HDLC
    ISO = 0xD800000000000000
    // ECMA 182定义的ECMA多项式
    ECMA = 0xC96C5795D7870F42
)

预定义的多项式。

const Size = 8

CRC-64校验和的字节数。

type Table

type Table [256]uint64

长度256的uint64切片,代表一个用于高效运作的多项式。

func MakeTable

func MakeTable(poly uint64) *Table

返回一个代表poly指定的多项式的*Table。

func Checksum

func Checksum(data []byte, tab *Table) uint64

返回数据data使用tab代表的多项式计算出的CRC-64校验和。

func Update

func Update(crc uint64, tab *Table, p []byte) uint64

返回将切片p的数据采用tab表示的多项式添加到crc之后计算出的新校验和。

func New

func New(tab *Table) hash.Hash64

创建一个使用tab代表的多项式计算CRC-64校验和的hash.Hash64接口。

fnv

fnv包实现了FNV-1和FNV-1a(非加密hash函数),算法参见:

http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function

func New32

func New32() hash.Hash32

返回一个新的32位FNV-1的hash.Hash32接口

func New32a

func New32a() hash.Hash32

返回一个新的32位FNV-1a的hash.Hash32接口

func New64

func New64() hash.Hash64

返回一个新的64位FNV-1的hash.Hash64接口

func New64a

func New64a() hash.Hash64

返回一个新的64位FNV-1a的hash.Hash64接口


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:DevilRoshan

查看原文:Golang标准库——hash

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1354 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传