【问题标题】:Hash Code Implementation哈希码实现
【发布时间】:2010-11-07 15:50:16
【问题描述】:

关于这个问题 (Efficient hashCode() implementation) 我还有一个问题。

我有一个“值”类,它的实例保存在数据库中。因此这个类的实例都有一个唯一的 ID。

因此,我只需返回此 id 就实现了哈希码方法(和相关的 equals 方法)。

当使用 Eclipse 哈希码生成器并告诉 Eclipse 仅使用 ID 属性进行生成时,我有以下方法:

    @Override
    public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + id;
            return result;
    }

我认为简单地返回 id 会更有效,因为我知道这个 id 是唯一的。我说的对吗?

提前致谢

【问题讨论】:

  • 如果结果为 1,为什么要按结果进行 mulply。您的功能实际上是“返回 31 + id;”。
  • 顺便说一句,你不妨去掉 31,因为它不会改变 id 的分布。简而言之,您实现的哈希码并没有做任何特别的事情,您应该只返回 id。话虽如此,我不确定什么会“更好”。

标签: java


【解决方案1】:

如果您的目标是身份唯一性,那么绝对可以。

请记住,由于您(可能)不是通过哈希函数的可能范围(即 int 的所有值)随机分布您的值,因此对于任何依赖于哈希的代码来说,性能可能是一个问题均匀分布。

附: “可能”来自我的假设,即这些唯一的整数可能是您的数据库中的标识值。如果它们真的是随机分布的,请忽略我的警告。

【讨论】:

  • java.util.HashMap 已经对哈希码应用了一个补充哈希函数来改善分布,所以分布应该不是问题。
  • 很高兴知道,但 HashMap 并不是唯一使用 hashCode() 的代码,因此分发可能是个问题。
【解决方案2】:

这不是 ID 的唯一性使这成为正确的做法 - 而是它用于相等性检查并且它是 唯一 用于相等性检查的东西。

Eclipse 的样板文件仅在您使用多个字段进行相等时才真正相关。

【讨论】:

  • +1 用于强调它的 不是 独特性 :-)。说得好。
猜你喜欢
  • 1970-01-01
  • 2016-03-25
  • 2012-09-26
  • 2012-06-03
  • 2011-10-14
  • 2011-09-15
  • 2017-10-04
  • 2015-04-25
相关资源
最近更新 更多