Hash 为什么这是一个糟糕的哈希函数?

Hash 为什么这是一个糟糕的哈希函数?,hash,hashmap,hashtable,Hash,Hashmap,Hashtable,我目前正在讨论哈希和哈希表,我想知道为什么像下面这样的东西被认为是一个坏的哈希函数(伪代码): 函数散列(字符串\u t字,整数表\u大小) i=随机生成的数字,值为0良好的哈希函数应适用于各种输入大小,条件是表大小为输入数量的常数倍。这不符合该标准,原因如下: 哈希值仅由第一个字母确定。因此,可能的散列值的总数以可能的第一个字母的数量为界,这是很小的。为大量输入选择较大的表大小没有任何效果:您仍然会遇到大量冲突 因为单词的第一个字母远远不是均匀分布的,所以会有很多碰撞。在定义函数时,至少要使用

我目前正在讨论哈希和哈希表,我想知道为什么像下面这样的东西被认为是一个坏的哈希函数(伪代码):

函数散列(字符串\u t字,整数表\u大小)

i=随机生成的数字,值为0良好的哈希函数应适用于各种输入大小,条件是表大小为输入数量的常数倍。这不符合该标准,原因如下:

  • 哈希值仅由第一个字母确定。因此,可能的散列值的总数以可能的第一个字母的数量为界,这是很小的。为大量输入选择较大的表大小没有任何效果:您仍然会遇到大量冲突

  • 因为单词的第一个字母远远不是均匀分布的,所以会有很多碰撞。在定义函数时,至少要使用单词的所有字母,但要拯救这个结构,你真的需要更多的建议

  • 定义d=gcd(i,表格大小)。在某些情况下,d将大于1,在这些情况下,表中每d个元素中只有一个有机会被填充:其他元素将被浪费空间(从而导致更多冲突)。也就是说,只有0,d,2d,3d。。。可能是哈希值。至少限制为d=1的i值,以防止这些退化情况

  • i乘以j的最大值有时会小于表的大小(当i很小时),这意味着永远不会触及表的顶端。更多浪费的空间


  • 人们通常会尝试提出一些哈希函数,这些函数通常都能很好地工作,并且可以证明它们的一些优点。在这里,你有一些东西是针对一个非常特殊的情况的,我最清楚的是消极的情况,因此非常怀疑你能证明这个构造的任何积极性。

    一个好的哈希函数应该适用于各种输入大小,仅在表大小为常量乘以输入数的情况下。这不符合该标准,原因如下:

  • 哈希值仅由第一个字母确定。因此,可能的散列值的总数以可能的第一个字母的数量为界,这是很小的。为大量输入选择较大的表大小没有任何效果:您仍然会遇到大量冲突

  • 因为单词的第一个字母远远不是均匀分布的,所以会有很多碰撞。在定义函数时,至少要使用单词的所有字母,但要拯救这个结构,你真的需要更多的建议

  • 定义d=gcd(i,表格大小)。在某些情况下,d将大于1,在这些情况下,表中每d个元素中只有一个有机会被填充:其他元素将被浪费空间(从而导致更多冲突)。也就是说,只有0,d,2d,3d。。。可能是哈希值。至少限制为d=1的i值,以防止这些退化情况

  • i乘以j的最大值有时会小于表的大小(当i很小时),这意味着永远不会触及表的顶端。更多浪费的空间


  • 人们通常会尝试提出一些哈希函数,这些函数通常都能很好地工作,并且可以证明它们的一些优点。在这里,你有一些东西是针对一个非常特殊的情况的,我最清楚的是否定的情况,因此非常怀疑你能证明这个构造的任何积极性。

    “哈希值只由第一个字母决定”。散列值不是由第一个字母和随机值共同决定的吗?还有,你所说的d=gcd(i,表大小)是什么意思?@PythonNewb:取决于你如何看待它!按照我的观察方式,随机值在开始时被选择,然后被固定。在该值固定后,两个单词将发生碰撞,当且仅当它们的第一个字母相同时。Gcd是最大公约数。此属性来自模运算。“哈希值仅由第一个字母确定”。散列值不是由第一个字母和随机值共同决定的吗?还有,你所说的d=gcd(i,表大小)是什么意思?@PythonNewb:取决于你如何看待它!按照我的观察方式,随机值在开始时被选择,然后被固定。在该值固定后,两个单词将发生碰撞,当且仅当它们的第一个字母相同时。Gcd是最大公约数。这个属性来自模运算。
    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