如何获得像cksum一样的CRC32?

问题描述 投票:0回答:2

我拿了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”?

即使使用硬编码表也不起作用

go crc32 gnu-coreutils
2个回答
0
投票

那个是CRC-32/CKSUM

width=32 poly=0x04c11db7 init=0x00000000 refin=false refout=false xorout=0xffffffff check=0x765e7680 residue=0xc704dd7b name="CRC-32/CKSUM"

0
投票

检查 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 之上处理这些参数。快速/真实的实现将从多项式创建另一个表。

© www.soinside.com 2019 - 2024. All rights reserved.