我拿了cksum
的
源代码并复制了多项式。这与 Go 标准库中定义的预定义 IEEE 变体相同。
package main
import (
"fmt"
"hash/crc32"
)
// https://github.com/coreutils/coreutils/blob/a9b78541fa7c06567c5b82fb4e89d85a1dc0c611/src/cksum.c#L54
//
// 32 26 23 22 16 12 11 10 8 7 5 4 2 1
// G(X)=X + X + X + X + X + X + X + X + X + X + X + X + X + X + 1
const p = 0b11101101101110001000001100100000
func main() {
cksum := crc32.MakeTable(p)
fmt.Println(crc32.Checksum([]byte("moin"), cksum))
fmt.Println(crc32.ChecksumIEEE([]byte("moin")))
}
结果是:3048661102
但是当我在 Debian 12 (coreutils 9.1) 上使用
cksum
时,结果是另外一回事:
$ printf "moin" | cksum
1401816862 4
这里出了什么问题?
更新
我认为问题已经解释了这里。
但问题仍然是:如何像
cksum
那样处理“hash/crc32”?
那个是CRC-32/CKSUM:
width=32 poly=0x04c11db7 init=0x00000000 refin=false refout=false xorout=0xffffffff check=0x765e7680 residue=0xc704dd7b name="CRC-32/CKSUM"
检查 CRC-32/CKSUM 的参数 https://reveng.sourceforge.io/crc-catalogue/all.htm
width=32 poly=0x04c11db7 init=0x00000000 refin=false refout=false xorout=0xffffffff check=0x765e7680 residue=0xc704dd7b name="CRC-32/CKSUM"
并与 CRC-32/ISO-HDLC 的参数进行比较,我相信它对应于 hash/crc32 中的算法:
width=32 poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926 residue=0xdebb20e3 name="CRC-32/ISO-HDLC"
只能调整 hash/crc32 中的 poly(多项式),但不能调整 init(初始值)、refin(反映输入)或 refout(反映输出)。
这是一个简单的示例,它在 hash/crc32 之上处理这些参数。快速/真实的实现将从多项式创建另一个表。