HashTable 的 Key、Value、Hash 和 Hash 函数

Posted

技术标签:

【中文标题】HashTable 的 Key、Value、Hash 和 Hash 函数【英文标题】:Key, Value, Hash and Hash function for HashTable 【发布时间】:2019-12-20 13:47:03 【问题描述】:

我无法理解 Hash 函数的作用和不作用,以及 Bucket 到底是什么。

据我了解:

HashTable 是一种使用哈希函数将键映射到值的数据结构。

HashFunction 旨在将数据从任意/未知大小的数组映射到固定大小的数据数组。

原始数据数组中可以有重复的Values,但这无关紧要。

每个值都有一个唯一的键。因此,每个 Key 正好有 1 个 Value。

HashFunction 将为每个 (Value, Key) 对生成一个 HashCode。但是,当多个(值、键)对映射到同一个 HashCode 时,可能会发生冲突。

这可以通过使用链式/开放式寻址方法来解决。

HashCode 是指示特定条目在 Bucket 数组中的原始数据数组中的位置的索引值。

Bucket 数组是构造的固定数据数组,将包含原始数组中的条目。

我的问题:

如何为每个值生成密钥? HashFunction 是否意味着为每个条目生成 Key 和 HashCode 值?因此每个 Bucket 是否只包含一个条目(假设使用 Chaining 实现来补救冲突)?

【问题讨论】:

【参考方案1】:

如何为每个值生成 Key?

密钥不是生成的,它是由您提供的,用作哈希函数的输入,哈希函数又将该密钥转换为哈希表的索引。简单来说:

H(key)=index

所以你正在寻找的价值是:

hash_table[index] = value

HashFunction 是否意味着为每个条目生成 HashCode 值?

这一切都取决于哈希函数和哈希表的实现。一些散列函数可能会根据提供的键生成散列码,然后取其modulo(size),其中size 是散列表的大小,以便获取索引。其他人可能会将键直接转换为索引。在任何一种情况下,哈希函数的最终目标都是在恒定时间内在哈希表中找到搜索数据的位置。

因此每个 Bucket 是否只包含一个条目(假设使用 Chaining 实现来解决冲突)?

理想情况下,每个键都应该映射到唯一的索引,但大多数情况下并非如此,因为桶的数量(即索引)远小于键的数量,因此每个桶的链的平均长度(即冲突的数量)每个桶)是no.of keys/no.of indices

【讨论】:

那么这样说是否更合适:HashCode 应该是一种为特定(值,键)对生成整数值(哈希码)的方法,理想情况下这将是唯一的; HashFunction 应该是一种根据哈希码将每个(值、键)对映射到 Bucket 数组中某个位置的方法? @K.Doe 用于特定的“密钥”。不是(值,键) @K.Doe 忘记了价值。价值只是你想要存储的东西。散列不处理它 知道了。非常感谢!

以上是关于HashTable 的 Key、Value、Hash 和 Hash 函数的主要内容,如果未能解决你的问题,请参考以下文章

HashMap和HashTable区别

学习Key与Value的集合hashtable

为什么Hashtable ConcurrentHashmap不支持key或者value为null

HashTable 的 Key、Value、Hash 和 Hash 函数

HashMap源码分析

如何获得Hashtable中所有key的值和value的值