我需要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将数字解释为字符串?
我相信您的观察可以通过仔细查看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] 删除。
我来说两句