【问题标题】:What good is a hash code if it doesn't identify a unique object?如果哈希码不能识别唯一的对象,它有什么用?
【发布时间】:2017-06-12 23:25:53
【问题描述】:

Java API - 类对象

哈希码:

如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

如果两个对象可以产生不同的整数结果,那么通过散列可以实现什么一致性?两个不同的对象可以返回相同的哈希值似乎很奇怪。

【问题讨论】:

  • 哈希冲突是哈希的重要组成部分,这是没有无限内存的问题之一。
  • 哈希码是大值空间到小得多的值空间的映射。没有唯一性的含义。
  • 唯一性是相对术语。如果我们谈论的是真正唯一的对象,那么它是由它的内存地址定义的。如果我们谈论的是散列集合的唯一性,那么它是由散列码和 equals 方法的组合定义的,没有什么能阻止两个不同的对象具有相同的散列码和 equals 方法。

标签: java hash


【解决方案1】:

哈希码只能有 232 个整数值(至少在 Java 中是这样)。如果您有更多可能的对象,那么具有相同哈希值的两个不同对象是不可避免的。我们尽最大努力避免这些"hash collisions",但通常这在数学上是不可能的(参见pigeonhole principle)。

我们通常会尝试设计散列函数,使其输出在其范围内均匀分布,从而减少冲突。

【讨论】:

  • 这有帮助!我有点猜到了,但我并不肯定。谢谢!
【解决方案2】:

如果哈希码不能识别唯一的对象,它有什么用?

哈希码不能让您识别唯一的对象,但它可以让您识别该对象所在的唯一组。

然后,您只需考虑该组即可找到您的对象。

例如,一个 HashMap 可能有 500 个项目,分为 1,000 个组。多亏了哈希码,它会立即知道要查看这 1,000 个组中的哪一个,拒绝其他 999 个组。

无论该组有 0 个、1 个甚至 6 个元素,与查看全部 500 个元素相比,它仍然可以节省大量时间。

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 2013-06-18
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2015-08-12
    • 2017-10-03
    • 2013-06-28
    相关资源
    最近更新 更多