Java 和 Go 中的不同 CRC32 值
Different CRC32 values in Java and Go
我正在用 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)的 hash
包中的 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
Go 代码的输出是:
Checksum in go : 4294967295
我还比较了在 3 个步骤中生成的字节数组,它们具有相同的值。
我缺少什么以及如何确保处理这种不匹配?
感谢您的帮助!
使用与您的 Java 代码相同的多项式,您会得到相同的结果。
最常见的 CRC-32 多项式作为常量存在于 crc32
包中:crc32.IEEE = 0xedb88320
:
table := crc32.MakeTable(crc32.IEEE)
通过此更改,您会得到相同的结果。在 Go Playground.
上试用
我正在用 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)的 hash
包中的 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
Go 代码的输出是:
Checksum in go : 4294967295
我还比较了在 3 个步骤中生成的字节数组,它们具有相同的值。
我缺少什么以及如何确保处理这种不匹配?
感谢您的帮助!
使用与您的 Java 代码相同的多项式,您会得到相同的结果。
最常见的 CRC-32 多项式作为常量存在于 crc32
包中:crc32.IEEE = 0xedb88320
:
table := crc32.MakeTable(crc32.IEEE)
通过此更改,您会得到相同的结果。在 Go Playground.
上试用