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 |
另一种多项式 |
CRC32 主要用于数据完整性校验,不适用于安全场景。对于需要防篡改的场景,请使用
crypto/sha256 等加密哈希算法。