哈希码公式是否应该根据变量范围而改变?

问题描述 投票:0回答:1

我有一个名为 Dice 的基本类,它代表骰子组。我使用的格式是 D&D 的 NdX 格式。其中 N 是骰子的数量,X 是每个骰子的面数。例如。 5d6 是一组 5 个骰子,每个骰子有 6 个面。

我以前没有对哈希码做过任何事情,我认为这是一个不错的做法。据我了解,使用 equals() 方法相等的每个 Dice 必须具有相同的哈希码,并且哈希码应该“均匀分布”。我发现了以下计算 hascodes 的方法。

@Override
public int hashCode(){
    return Objects.hash(numSides, numDice);
}
// algo from https://stackoverflow.com/a/18066516/23651145

骰子的数量和每个骰子的面数都可以达到整数限制,但实际上它们可能分别不会超过 10 和 100。创建哈希码公式时是否应该考虑它们各自的范围?变量的顺序重要吗?我如何测试给定的哈希码公式有多好?

java hash hashmap hashtable hashcode
1个回答
0
投票

您可以提供

hash
函数的任何实现。

它应该只是维持合同。

合约:

  • {
    hashCode
    }的总合约为:
    • 每当在同一对象上多次调用它时 Java 应用程序的执行,即 {
      hashCode
      } 方法 在没有提供任何信息的情况下,必须始终返回相同的整数 在对象上的 {@code equals} 比较中使用的内容被修改。 该整数不需要在一次执行中保持一致 应用程序到同一应用程序的另一个执行。
    • 如果两个对象根据{@link #equals(Object) equals} 方法,然后调用 { 两个对象中的每一个上的
      hashCode
      } 方法都必须生成 相同的整数结果。
    • 如果两个对象不相等则不需要 根据 {@link #equals(Object) equals} 方法,则 对两个对象分别调用
      hashCode
      方法 必须产生不同的整数结果。 然而,程序员 应该意识到,产生不同的整数结果 不相等的对象可以提高哈希表的性能。
© www.soinside.com 2019 - 2024. All rights reserved.