Java CRC32与MySQL CRC32不匹配

Java CRC32与MySQL CRC32不匹配,java,mysql,Java,Mysql,我需要Java的CRC32来匹配MySQL的CRC32,但是我得到了不同的结果 MySQL 爪哇 结果:校验和:747753823 为什么会发生这种情况?我猜MySQL将数字解释为字符串?问题正如我所假设的,MySQL将数字解释为字符串。将数字字符串传递给Java解决了这个问题: Checksum checksum = new CRC32(); String id = "148595460"; checksum.update(id.getBytes(), 0, id.length()); Sys

我需要Java的CRC32来匹配MySQL的CRC32,但是我得到了不同的结果

MySQL

爪哇

结果:
校验和:747753823


为什么会发生这种情况?我猜MySQL将数字解释为字符串?

问题正如我所假设的,MySQL将数字解释为字符串。将数字字符串传递给Java解决了这个问题:

Checksum checksum = new CRC32();
String id = "148595460";
checksum.update(id.getBytes(), 0, id.length());
System.out.println("Checksum: " + checksum.getValue());

结果:
Checksum:4137475682

我相信您的观察结果可以通过仔细查看MariaDB和Java的API来解释:

MariaDB:

计算循环冗余校验值并返回32位无符号值。如果参数为NULL,则结果为NULL参数应为字符串,如果可能,则视为字符串。

换句话说,在MariaDB中调用
CRC32(148595460)
时,它使用的是字符串
148595460
。现在让我们看看Java

Java:

从以下文件中:

使用指定的字节数组更新CRC-32校验和

换句话说,您传入了
int
值148595460,然后该值被转换为字节数组

如果您尝试以下Java代码,我相信您将获得所需的行为:

Checksum checksum = new CRC32();
byte[] b = "148595460".getBytes();
checksum.update(b);
system.out.println("Checksum: " + checksum.getValue());
Checksum checksum = new CRC32();
String id = "148595460";
checksum.update(id.getBytes(), 0, id.length());
System.out.println("Checksum: " + checksum.getValue());
Checksum checksum = new CRC32();
byte[] b = "148595460".getBytes();
checksum.update(b);
system.out.println("Checksum: " + checksum.getValue());