Java CRC32与MySQL CRC32不匹配

用户名

我需要Java的CRC32来匹配MySQL的CRC32,但是得到的结果却有所不同。

的MySQL

MariaDB> SELECT CRC32(148595460);
+------------------+
| CRC32(148595460) |
+------------------+
|       4137475682 |
+------------------+
1 row in set (0.00 sec)

爪哇

Checksum checksum = new CRC32();
checksum.update(ByteBuffer.allocate(4).putInt(148595460).array(), 0, 4);
System.out.println("Checksum: " + checksum.getValue());

结果: Checksum: 747753823

为什么会这样?我猜MySQL将数字解释为字符串?

蒂姆·比格莱森(Tim Biegeleisen)

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

MariaDB:

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

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

Java的:

从文档中CRC32.update

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

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

如果您尝试下面的Java代码,我相信您将获得想要的行为:

Checksum checksum = new CRC32();
byte[] b = "148595460".getBytes();
checksum.update(b);
system.out.println("Checksum: " + checksum.getValue());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章