首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java CRC32与MySQL CRC32不匹配

Java CRC32与MySQL CRC32不匹配
EN

Stack Overflow用户
提问于 2016-07-30 07:14:03
回答 2查看 497关注 0票数 1

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

MySQL

代码语言:javascript
复制
MariaDB> SELECT CRC32(148595460);
+------------------+
| CRC32(148595460) |
+------------------+
|       4137475682 |
+------------------+
1 row in set (0.00 sec)

Java

代码语言:javascript
复制
Checksum checksum = new CRC32();
checksum.update(ByteBuffer.allocate(4).putInt(148595460).array(), 0, 4);
System.out.println("Checksum: " + checksum.getValue());

结果:Checksum: 747753823

这一切为什么要发生?我猜MySQL把这个数字解释成一个字符串?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-30 07:26:40

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

MariaDB:

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

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

Java:

来自CRC32.update的文档

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

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

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

代码语言:javascript
复制
Checksum checksum = new CRC32();
byte[] b = "148595460".getBytes();
checksum.update(b);
system.out.println("Checksum: " + checksum.getValue());
票数 1
EN

Stack Overflow用户

发布于 2016-07-30 07:23:52

问题就像我想象的一样,MySQL将数字解释为一个字符串。将数字字符串传递给Java解决了这个问题:

代码语言:javascript
复制
Checksum checksum = new CRC32();
String id = "148595460";
checksum.update(id.getBytes(), 0, id.length());
System.out.println("Checksum: " + checksum.getValue());

结果:Checksum: 4137475682

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38671376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档