hash/crc32 包基本用法


hash/crc32 包实现了 32 位循环冗余校验 (CRC-32)。

基本用法

package main

import (
	"fmt"
	"hash/crc32"
)

func main() {
	// 直接计算 CRC32
	data := []byte("Hello, World!")
	sum := crc32.ChecksumIEEE(data)
	fmt.Printf("CRC32-IEEE: %d (0x%x)\n", sum, sum)
}

使用 Hash 接口

package main

import (
	"fmt"
	"hash/crc32"
)

func main() {
	// 创建 CRC32 哈希器
	table := crc32.MakeTable(crc32.IEEE)
	hash := crc32.New(table)

	// 分多次写入数据
	hash.Write([]byte("Hello, "))
	hash.Write([]byte("World!"))

	// 获取校验和
	sum := hash.Sum32()
	fmt.Printf("CRC32: %d (0x%x)\n", sum, sum)

	// 重置并重新计算
	hash.Reset()
	hash.Write([]byte("Different data"))
	fmt.Printf("新 CRC32: %d\n", hash.Sum32())
}

不同多项式

package main

import (
	"fmt"
	"hash/crc32"
)

func main() {
	data := []byte("test data")

	// IEEE 多项式(最常用)
	ieee := crc32.Checksum(data, crc32.MakeTable(crc32.IEEE))
	fmt.Printf("IEEE:     0x%08x\n", ieee)

	// Castagnoli 多项式(性能更好)
	castagnoli := crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli))
	fmt.Printf("Castagnoli: 0x%08x\n", castagnoli)

	// Koopman 多项式
	koopman := crc32.Checksum(data, crc32.MakeTable(crc32.Koopman))
	fmt.Printf("Koopman:  0x%08x\n", koopman)
}

实际应用:数据校验

package main

import (
	"encoding/binary"
	"fmt"
	"hash/crc32"
)

// 带校验和的数据包
type Packet struct {
	Data     []byte
	Checksum uint32
}

// 计算并添加校验和
func (p *Packet) CalcChecksum() {
	p.Checksum = crc32.ChecksumIEEE(p.Data)
}

// 验证校验和
func (p *Packet) Verify() bool {
	return crc32.ChecksumIEEE(p.Data) == p.Checksum
}

func main() {
	// 创建数据包
	packet := Packet{
		Data: []byte("重要数据"),
	}

	// 计算校验和
	packet.CalcChecksum()
	fmt.Printf("数据: %s\n", packet.Data)
	fmt.Printf("校验和: %d\n", packet.Checksum)

	// 验证
	fmt.Printf("验证结果: %v\n", packet.Verify())

	// 模拟数据损坏
	packet.Data[0] = 'X'
	fmt.Printf("数据损坏后验证: %v\n", packet.Verify())
}

总结

多项式 常量 说明
IEEE crc32.IEEE 最常用,标准 CRC-32
Castagnoli crc32.Castagnoli 性能优化,适合硬件实现
Koopman crc32.Koopman 另一种多项式
如有疑问关注公众号给我留言
wx

关注公众号

©2017-2026 鲁ICP备17023316号-1 Powered by Hugo