gpt4 book ai didi

java - Apache Commons HashCodeBuilder : null vs zero for Numeric types

转载 作者:行者123 更新时间:2023-12-02 08:42:33 25 4
gpt4 key购买 nike

最近,我在使用 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

MyObject 定义:

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 ,这意味着我不知道是否为任何给定输入实际定义了 equals()hashcode() ,并且如果缺少这些方法,我无法编辑类定义来添加这些方法。这可能就是此代码的原始作者选择使用 reflectionHashCode() 的原因。考虑到这一点,是否有一个基于编程/基于代码的解决方案或解决方法来解决此问题,例如不需要 equals()hashcode() 的替代库> 在被比较的对象上定义?

最佳答案

即使对于具有完全不同值的对象,也始终存在哈希码冲突的可能性。毕竟,您将无数个可能的对象值映射到 32 位整数。这仍然有效,因为利用集合和映射等代码的数据结构还使用 .equals 来检查对象相等性。

关于java - Apache Commons HashCodeBuilder : null vs zero for Numeric types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61281465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com