Apache Commons hashCode构建器不一致的哈希值

时间:2016-12-12 11:06:05

标签: java hashcode apache-commons-lang3

我使用哈希码构建器作为pojo的实例变量。

public class Pojo {
private HashCodeBuilder hashBuilder = new HashCodeBuilder(); 
private int i;
public setI(int i) {this.i = i}

@Override
public int hashCode() {           
    hashBuilder.append(id);        
    return hashBuilder.toHashCode();
}
}

现在,如果我将i的值设置为相同的值两次,那么我的哈希码结果将会不同。这是实施中的错误吗?

我知道它正在发生,因为哈希码构建器保持运行总计。但它不应该为同一组值提供相同的哈希值吗?

另外,如果我不遵循上述方法,那么我将最终在我的pojo的hashcode方法中初始化相同的哈希码构建器数千次,如下所示:

...
@Override
public int hashCode() {   
    hashBuilder = new HashBuilder();        
    hashBuilder.append(id);        
    return hashBuilder.toHashCode();
}
...

有没有办法重置这个运行总计,这样每次我用同一组值调用hashcode时,我都会得到一致的答案?

1 个答案:

答案 0 :(得分:1)

您这样做的方式每次拨打id时,您都会追加另一个hashCode()。由于append()正在接受值(不是字段名称!),HashCodeBuilder无法知道您是否附加了id两次,或者您是否有另一个具有相同值的字段

HashCodeBuilder中本地创建hashCode()。不要以为它会以显着的方式影响性能,除非你已经对应用程序进行了分析并证明它确实存在(也就是说避免过早优化)。

如果您确实希望避免在每个HashCodeBuilder上不必要地创建hashCode(),则必须跟踪设置器中的更改,并在每次设置时将hashCodeBuilder设置为null价值通过二传手变化;然后根据需要在hashCode()中使用它。然后你必须确保所有的字段修改都通过setter。相当多的工作和许多事情都可能出错,所以如果可能的话,你真的想避免这一切。