【问题标题】:Basic Hashing Concepts基本哈希概念
【发布时间】:2012-02-19 19:47:26
【问题描述】:

我有一个非常基本的问题。相信我,我读过很多书,看过视频,但无法得到我的答案。 假设我们有 HashMap。 我有 3(a,b,c) 映射到相同哈希的值,a 和 b 相同但 c 不同。 如果我只在 hastable 中添加 a 和 b,hashMap 怎么知道它不是冲突。

假设我们有 Hashmap.... 现在我调用 put(obj1,"Test") 然后 put(obj2,"Test") obj1 和 obj2 映射到同一个键...。你能告诉我什么是 hash map将为这两个调用存储

它会存储实际的对象吗? 如果不是,如果 obj1 和 obj2 相同,它将如何在第二次调用时确定它不是冲突。

谢谢

【问题讨论】:

  • 因为a和b是一样的?
  • 但据我所知,HashTable 只知道键而不是实际的键值,即说 a 和 b 映射到键 k,我认为 hashtable 只知道 k 而不是 a 和 b。我错了吗?
  • 如果 a 和 b 相同,则 碰撞。你是想问它如何区分 a/b 和 c 吗?无论如何,您的问题是非常基本的,并且之前已经回答过。
  • @delnan 你是说如果 a 和 b 相同,那就是碰撞?是的,我想知道如何区分 b/w a/b 和 c

标签: data-structures hashmap hashtable


【解决方案1】:

大多数哈希表需要存储对象的两位支持 - GetHashCode() 和 Equals()。

如果两个对象返回相同的 GetHashCode() 但它们与 Equals() 的比较返回 true,则它们表示相同的数据,因此不是冲突,只是重复条目。

如果两个对象返回相同的GetHashCode(),并且它们的比较返回false,则Hashtable知道对象代表不同的事物,因此将其视为碰撞。

这就是为什么在许多 oop 语言(如 C#)中,您必须在存储对象中覆盖/实现 GetHashCode() 和 Equals()。如果你曾经实现这些方法,使得两个对象在与 Equals() 比较时返回 true,但从 GetHashCode() 返回不同的值,那么你就有一个错误。

【讨论】:

  • 那么你说HashTable存储实际的关键对象.....我以为它只存储值..
  • @user973931 如果它只存储密钥,它如何返回给定密钥的值?当然不能。
  • @delnan 它将计算哈希并返回索引处的值
  • @user973931 所以它存储值;)
  • @user973931,这是行不通的,因为它无法处理冲突。一个简单的哈希表实现将有一个用于存储桶的数组,这些桶将使用哈希码进行索引,然后每个索引存储另一个数组。查找的工作方式是转到给定哈希码的存储桶,然后沿着数组向下走,直到找到 Equals 使用传入的键返回 true 的键。
【解决方案2】:

根据*:

在计算机科学中,哈希表或哈希映射是一种数据结构, 使用散列函数来映射标识值,称为键(例如, 人的名字),到他们的关联值(例如,他们的电话 数字)。因此,哈希表实现了关联数组。

Wiki 也将关联数组称为“由(键、值)对的集合组成的抽象数据类型”。

所以是的,哈希表确实知道他们的“租户”。

【讨论】:

  • 所以如果我使用 HashTable.. 它需要多少内存.. 我认为需要的内存是 HashTable Size() * Integer Size... 如果这是正确的它存储租户