2017-05-04 54 views
2

假设散列表是一个索引为0到HASHSIZE-1的数组。该函数返回正确范围内的值,并且不会生成任何运行时错误。假设在String中传入的字符至少有2个字符。为什么它是一个糟糕的散列函数?为什么给定的散列函数是一个糟糕的散列函数?

public static int hash(String key) { 
    return (key.charAt(0) 
      + key.charAt(1) 
      + key.charAt(key.length()-1) % HASHSIZE; 
} 
+1

看起来会有很多碰撞,这很糟糕。 – Carcigenicate

+1

检查分配 –

+1

它似乎也忽略了大部分字符串的内容,这是没用的。 – Carcigenicate

回答

2

散列函数的质量取决于它们在预期的密钥群中创建的冲突的数量。当不同的密钥产生相同的散列码的可能性较小时,良好的功能会造成情况。

此方法的质量取决于使用的键的预期长度。对于长度为三的密钥,这是一种完全可以接受的方法,尽管它并不理想,因为哈希不会根据字母顺序进行更改。

对于长度为10的密钥,此方法将为所有密钥生成冲突,这些冲突始于最后具有相同字母的同一对字母开始。当两个首字母和最后一个字母组合重复很多时,您将碰到碰撞,使得这个哈希函数不太有用。

+0

此外,该函数不会使用完整的'int'范围;结果将永远不会超过196605,所以如果'HASHSIZE'大于此值,表格的上半部分将完全未被使用,而在下半部分有很多可避免的冲突。 – Holger