Java和Go中不同的CRC32值

问题描述 投票:1回答:1

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

Java Utility使用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)的hash包中的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

Go代码的输出是:

Checksum in go : 4294967295

我还比较了在3个步骤中生成的字节数组,它们具有相同的值。

我想念的是什么?如何确保解决这种不匹配?

感谢帮助!

java security go checksum crc32
1个回答
1
投票

使用与您的Java代码相同的多项式,您将获得相同的结果。

crc32包中的常量是最常见的CRC-32多项式:crc32

crc32.IEEE = 0xedb88320

通过此更改,您得到相同的结果。在table := crc32.MakeTable(crc32.IEEE) 上尝试。

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