Java和Go中的不同CRC32值

Java和Go中的不同CRC32值,java,security,go,checksum,crc32,Java,Security,Go,Checksum,Crc32,我正在用Go编写一个实用程序,可以用来计算输入字符串的CRC32校验和。Java中也有一个类似的实用程序,我们正在广泛使用它,并且一直运行良好 Java实用程序使用Java.util.zip.CRC32计算校验和。伪代码如下: public static void main(String[] args) { final Checksum checksum = new CRC32(); byte[] input1Bytes = "input1".getBytes(

我正在用Go编写一个实用程序,可以用来计算输入字符串的CRC32校验和。Java中也有一个类似的实用程序,我们正在广泛使用它,并且一直运行良好

Java实用程序使用
Java.util.zip.CRC32
计算校验和。伪代码如下:

 public static void main(String[] args) {
        final Checksum checksum = new CRC32();
        byte[] input1Bytes = "input1".getBytes(StandardCharsets.UTF_8);
        checksum.update(input1Bytes, 0, input1Bytes.length);
        final byte[] input2Bytes = "input2".getBytes(StandardCharsets.UTF_8);
        checksum.update(input2Bytes, 0, input2Bytes.length);
        final byte[] input3Bytes = "input3".getBytes(StandardCharsets.UTF_8);
        checksum.update(input3Bytes, 0, input3Bytes.length);
        System.out.println("Checksum in Java : " + checksum.getValue());
    }
Go中的实用程序使用Go SDK(1.13.6版)的
散列
包中的
crc32
import“hash/crc32”
) Go中生成校验和的伪代码如下:

    table := crc32.MakeTable(0)
    checksum := crc32.Checksum([]byte("input1"), table)
    checksum = crc32.Update(checksum, table, []byte("input2"))
    checksum = crc32.Update(checksum, table, []byte("input3"))
    log.Printf("Checksum in go : %v", checksum)
Java代码的输出为:

Checksum in Java : 2705255531
Checksum in go : 4294967295
Go代码的输出为:

Checksum in Java : 2705255531
Checksum in go : 4294967295
我还比较了3个步骤中生成的字节数组,它们的值相同

我遗漏了什么?如何确保处理这种不匹配


谢谢你的帮助

使用与Java代码相同的多项式,得到相同的结果

最常见的CRC-32多项式作为常量存在于包中:
crc32.IEEE=0xedb88320

table := crc32.MakeTable(crc32.IEEE)

通过这种改变,你会得到同样的结果。在上试试。

不是4294967295=0xFFFF\u FFFF吗?然后golang似乎关闭了。调用
crc32.MakeTable(0)
显然是错误的:您将多项式设置为零。你想要哪个多项式?(零永远是不对的。)也非常感谢@JoopEggen和@torek的回复。你是对的@torek,
crc32。MakeTable(0)
是问题所在。我将它改为
table:=crc32.IEEETable
,它似乎正在工作。将对此进行测试,以确保它涵盖所有方面。是的,看起来它是正确的。请注意,
hash/crc32
代码使用了一个小的尾数(或位反转)多项式,因此
0x04C11DB7
不正确。然而,位反转
0x04C11DB7
会产生
0xedb88320
,这是
crc32.IEEE
。谢谢!在Torek添加了一条评论后发现了这一点。