我目前正在讨论哈希表和哈希表,我想知道为什么类似以下内容被认为是错误的哈希函数(伪代码):
function hash(String_t word, Int table_size)
i = randomly generated number with 0<i<table_size
j = ASCII code of the first letter of word
return i * j % table_size
假设在函数调用期间可以存储i
的值以实现一致性(例如,使用C中的static
关键字在函数范围内存储i
的值) ,为什么这是一个糟糕的哈希函数?
答案 0 :(得分:2)
良好的散列函数应该适用于各种输入大小,只有表大小是输入数的常数大小的条件。由于以下几个原因,这不符合该标准:
哈希值仅由第一个字母决定。因此,可能的哈希值的总数受可能的第一个字母的数量限制,这可能很小。为大量输入选择较大的表格大小无效:您仍然会遇到大量的碰撞。
由于单词的第一个字母距离均匀分布很远,因此会发生很多碰撞。在定义你的功能时至少要使用单词的所有字母,但你真的需要的不仅仅是建议来拯救这个结构。
定义d = gcd(i,表格大小)。在某些情况下,d将大于1,并且在这些情况下,表中每个d元素中只有一个将有机会被填充:其他元素将被浪费空间(因此更多的冲突)。也就是说,只有0,d,2d,3d,......可能是一个哈希值。至少限制i的值,d = 1,以防止这些退化的情况。
我乘以j的最大值偶尔会小于表格大小(当我很小时),这意味着表格的最高端永远不会被触及。更浪费空间。
人们通常会尝试提供一般运行良好的哈希函数,并且可以证明它们的优点。在这里,你有一些针对特定案例的内容,对我来说最明显的是负面案例,因此非常怀疑你能证明这个结构有什么积极意义。