我取了cksum中的source code并复制了该多项.这与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

这里出了什么问题?

Update

我认为这个问题解释了here.

但问题仍然是:如何像cksum一样处理"hash/crc 32"?

It does not work even with a hard coded table.

推荐答案

判断CRC-32/CKNUM的参数 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-LCC的参数进行比较,我认为该参数对应于hash/crc 32中的算法:

width=32 poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926 residue=0xdebb20e3 name="CRC-32/ISO-HDLC"

哈希/crc 32中只能调整poly(多项),而不能调整init(初始值)、refin(反射输入)或refout(反射输出).

除了这些参数之外,cksum程序还处理输入之后的输入流长度的表示.

Here是一些简单的代码,用hash/crc 32产生预期的输出.快速/真实的实现将从多名创建另一个表.

Go相关问答推荐

追加一个字节数组的分配比2个字节数组的分配要少得多

如何使用GRPC UnaryClientInterceptor中的`maily`参数?

Kafka消费者在需要时不会暂停

减少在围棋中映射DTO时的重复代码量

Golang内置打印(Ln)函数&S行为怪异

一次打印用户输入的字符串n次

用 fork 替换 Go 依赖:...用于两个不同的模块路径

使用Goldmark在golang中添加ChildNode会导致堆栈溢出

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

如何从 Go 中的 `HijackedResponse` 中删除 Cursor Position ANSI 转义码?

当图像是对象数组的元素时,如何显示存储为页面资源的图像?

go-libp2p - 从流中接收字节

如何在 helm 中将字符串连接到 .AsConfig 的结果?

使用 AppID 在 Windows 中启动应用程序并获取 pid

如何通过组合来自不同包的接口来创建接口?

如何在 docker 文件中安装 golang 包?

Beego - 我需要context.Context而不是 Beego 上下文

如何动态解析 Go Fiber 中的请求正文?

有没有一种方法可以确保传递的值具有使用泛型的某些字段?

在 Go 泛型中,如何对联合约束中的类型使用通用方法?