golang標(biāo)準(zhǔn)庫crc32的使用樣例
1.概述
crc32實(shí)現(xiàn)了32位循環(huán)冗余檢測算法的實(shí)現(xiàn)。目前crc32內(nèi)部提供 了三種常用的多項(xiàng)式,采用查表法來提高計(jì)算checksum的效率。通過crc32.MakeTable()可以獲取對應(yīng)的表,crc32提供了一個(gè)IEETABLE可以直接使用,官方鏈接如下:crc32 package - hash/crc32 - Go Packages

圖1 多項(xiàng)式對應(yīng)常量
2.API簡介
表1 crc32對外暴露函數(shù)
| 函數(shù)名稱 | 參數(shù) | 返回值 | 簡介 |
| Checksum | data:[]byte tab:*crc.Table | checksum:uint32 | 輸入計(jì)算校驗(yàn)和的原始數(shù)據(jù)和校驗(yàn)方式,獲取校驗(yàn)和。 |
| ChecksumIEEE | data:[]byte | checksum:uint32 | 輸入計(jì)算校驗(yàn)和的原始數(shù)據(jù),使用IEEE多項(xiàng)式獲取校驗(yàn)和。 |
| New | tab:*crc.Table | hash.Hash32 | 獲取特定校驗(yàn)方式的hash,后續(xù)調(diào)用Sum即可獲取校驗(yàn)和 |
| NewIEEE | 無 | hash.Hash32 | 獲取IEEE方式的hash,后續(xù)調(diào)用Sum即可獲取校驗(yàn)和 |
| Update | crc:uint32 tab:*crc.Table p:[]byte | checksum:uint32 | 適用于流式數(shù)據(jù),繼續(xù)追加數(shù)據(jù)計(jì)算校驗(yàn)和 |
官方對外暴漏了5個(gè)函數(shù),hash和Update這兩種方式支持追加數(shù)據(jù)。
3.使用樣例
package main
import (
"fmt"
"hash/crc32"
)
func main() {
originalData := []byte("hello world")
i3eCheckSum1 := crc32.Checksum(originalData, crc32.IEEETable)
i3eCheckSum2 := crc32.ChecksumIEEE(originalData)
fmt.Println(i3eCheckSum1, i3eCheckSum2)
//MakeTable使用方式
caTable := crc32.MakeTable(crc32.Castagnoli)
kmTable := crc32.MakeTable(crc32.Koopman)
caCheckSum := crc32.Checksum(originalData, caTable)
kmCheckSum := crc32.Checksum(originalData, kmTable)
fmt.Println("castagnoli checksum is: ", caCheckSum)
fmt.Println("koopman checksum is: ", kmCheckSum)
caHash := crc32.New(caTable)
_, err := caHash.Write(originalData)
if err != nil {
panic(err)
}
caCheckSum1 := caHash.Sum32()
fmt.Println("castagnoli checksum is: ", caCheckSum1)
i3eHash := crc32.NewIEEE()
//此處可以一直追加數(shù)據(jù)
_, err = i3eHash.Write(originalData)
if err != nil {
panic(err)
}
i3eCheckSum3 := i3eHash.Sum32()
fmt.Println("ieee checksum is: ", i3eCheckSum3)
newData := []byte("你好,世界")
//采用update追加數(shù)據(jù)(適用于計(jì)算之后再追加數(shù)據(jù)的場景)
newCheckSum1 := crc32.Update(i3eCheckSum1, crc32.IEEETable, newData)
//直接追加數(shù)據(jù)之后再計(jì)算
newCheckSum2 := crc32.ChecksumIEEE(append(originalData, newData...))
fmt.Println(newCheckSum1, newCheckSum2)
}總結(jié)
到此這篇關(guān)于golang標(biāo)準(zhǔn)庫crc32使用的文章就介紹到這了,更多相關(guān)golang標(biāo)準(zhǔn)庫crc32使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go使用makefile腳本編譯應(yīng)用的方法小結(jié)
makefile可以看作是make工具的腳本文件, 而make主要用來處理一系列命令。常用的比如用來編譯和打包文件, 在C/C++的編譯打包中應(yīng)用最廣泛了,這篇文章主要介紹了go使用makefile腳本編譯應(yīng)用,需要的朋友可以參考下2022-08-08
一文詳解go中如何實(shí)現(xiàn)定時(shí)任務(wù)
定時(shí)任務(wù)是指按照預(yù)定的時(shí)間間隔或特定時(shí)間點(diǎn)自動(dòng)執(zhí)行的計(jì)劃任務(wù)或操作,這篇文章主要為大家詳細(xì)介紹了go中是如何實(shí)現(xiàn)定時(shí)任務(wù)的,感興趣的可以了解下2023-11-11
關(guān)于golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路
這篇文章主要介紹了golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路詳解,通過思路圖分析及實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08

