我需要Java的CRC32来匹配MySQL的CRC32,但是我得到了不同的结果。
MySQL
MariaDB> SELECT CRC32(148595460);
+------------------+
| CRC32(148595460) |
+------------------+
| 4137475682 |
+------------------+
1 row in set (0.00 sec)Java
Checksum checksum = new CRC32();
checksum.update(ByteBuffer.allocate(4).putInt(148595460).array(), 0, 4);
System.out.println("Checksum: " + checksum.getValue());结果:Checksum: 747753823
这一切为什么要发生?我猜MySQL把这个数字解释成一个字符串?
发布于 2016-07-30 07:26:40
我相信您的观察可以通过仔细查看MariaDB和Java的API来解释:
MariaDB:
计算循环冗余校验值,并返回32位无符号值.如果参数为空,则结果为空。参数应该是字符串,如果不是,则(如果可能的话)被视为字符串。
换句话说,当您在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());发布于 2016-07-30 07:23:52
问题就像我想象的一样,MySQL将数字解释为一个字符串。将数字字符串传递给Java解决了这个问题:
Checksum checksum = new CRC32();
String id = "148595460";
checksum.update(id.getBytes(), 0, id.length());
System.out.println("Checksum: " + checksum.getValue());结果:Checksum: 4137475682
https://stackoverflow.com/questions/38671376
复制相似问题