假设哈希表是索引为0到HASHSIZE-1的数组。该函数返回正确范围内的值,不会生成任何运行时错误。假设传入的String至少有2个字符。为什么它是一个糟糕的哈希函数?
public static int hash(String key) {
return (key.charAt(0)
+ key.charAt(1)
+ key.charAt(key.length()-1) % HASHSIZE;
}
答案 0 :(得分:2)
散列函数的质量取决于它们在预期的密钥数量中创建的冲突数。当不同的密钥产生相同的哈希码的可能性较小时,良好的函数会产生这种情况。
此方法的质量取决于所使用的密钥的预期长度。对于长度为3的密钥,这是一种完全可以接受的方法,尽管它并不理想,因为散列不会根据字母顺序而改变。
对于长度为10的密钥,此方法将为所有密钥生成冲突,这些密钥以相同字母对开始,末尾具有相同的字母。当两个首字母和最后一个字母组合重复很多时,你会得到碰撞,使得这个散列函数不那么有用。