java - Apache Commons HashCodeBuilder:数字类型的 null 与零
问题描述
最近,我在使用 Apache Commons Lang 3 的 Java 代码库中遇到了以下哈希码“相等”场景,令我惊讶的是,我找不到太多关于如何处理这似乎是常见问题的信息:
MyObject one = new MyObject();
one.setFoo("foo");
one.setBar(null);
MyObject two = new MyObject();
two.setFoo("foo");
two.setBar((short) 0);
int oneHash = HashCodeBuilder.reflectionHashCode(one);
int twoHash = HashCodeBuilder.reflectionHashCode(two);
System.out.println("oneHash: " + oneHash);
System.out.println("twoHash: " + twoHash);
System.out.println("Bar equality: " + Objects.equals(one.getBar(), two.getBar()));
前面的代码产生以下输出,这表明两个对象具有相同的哈希码,尽管它们不相等:
oneHash: 3781511
twoHash: 3781511
Bar equality: false
我的对象定义:
public class MyObject {
private String foo;
private Short bar;
public String getFoo() {
return foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
public Short getBar() {
return bar;
}
public void setBar(Short bar) {
this.bar = bar;
}
}
虽然我可以理解一个 null Numeric 和 0 Numeric 在纯数学意义上具有相同的散列,但在任何实际设置中,这都会导致不相等的对象具有相同的散列码,这可能会导致相当严重的冲突问题。
澄清/复杂化:虽然我希望能够只调用equals()
或hashcode()
对象,但不幸的是,我正在使用的代码库正在比较两个Object
s,这意味着我不知道是否equals()
或hashcode()
实际上是为任何给定输入定义的,而且我在缺少这些方法的情况下,我无法编辑类定义以添加这些方法。这可能是该代码的原作者选择使用reflectionHashCode()
. 考虑到这一点,是否有针对此问题的编程/基于代码的解决方案或解决方法,例如不需要equals()
或hashcode()
在被比较的对象上定义的替代库?
解决方案
即使对于具有完全不同值的对象,也总是存在哈希码冲突的可能性。毕竟,您将无限数量的所有可能的对象值映射到一个 32 位整数。这仍然有效,因为利用了诸如集合和映射之类的代码的数据结构还.equals
用于检查对象是否相等。
推荐阅读
- eclipse - Eclipse 可插拔功能
- javascript - TypeError:无法读取未定义的属性“地图”
- vue.js - Vuetify 组合导航抽屉
- git - 禁用 Jenkins 检查功能分支推送
- python - MainList 缺少 QuerySet。定义 MainList.model、MainList.queryset 或覆盖 MainList.get_queryset()
- java - 使用 spark 进行 hdfs 文件流式传输
- node.js - Angular 从 JSON 获取数据到模型并列出它
- django - 如何在 django 中创建一个日志数据库来记录创建、更新或删除对象的用户?
- sql - 有没有更好的方法来优先考虑子查询而不是使用 TOP?
- javascript - FullCalendar:在调用 RestAPI 调用后将 JSON 数据与 initialEvents 绑定