黑马程序员技术交流社区

标题: hashCode()方法怎样产生分布均匀的散列码 [打印本页]

作者: 乔建国    时间: 2012-5-11 22:13
标题: hashCode()方法怎样产生分布均匀的散列码
如果散列码集中在一块,HashMap或者HashSet在某些区域的负载会很重,不如分布均匀的散列函数快,那么怎么重写hashCode()方法比较好?
作者: 云惟桉    时间: 2012-5-12 02:10
这个要看你equals里的比较需要怎么定义了。
举例来说,如果你需要定义Emloyee类里比较员工的名字,工资,还有雇用时间,只有这三项同时都相同,对象才相同。
那么你的hashCode就需要散列这三项 形如:
public int hashCode(){
       return 7*name.hashCode()+11*new Double(salary).hashCode()+15*hireDay.hashCode();
}
如果你的equals只比较其中两项,就散列对应的两项;同理,散列是根据比较的条件来确定的。
需要说明一点的是:以上例子中的name和hireDay都是String类型的成员变量。
对于String类是使用下列算法来计算散列码的:
int hash = 0;
for(int i = 0 ; i < this.length() ; i++){
    hash = 31 * hash + this.charAt(i);
}
字符串的散列码是由内容导出的,因此两个字符串内容相同,那么它们的散列码也会相同。

当然很难有一个散列函数是绝对均匀的,但是只要根据需要比较的项目来散列,就可以达到散列的目的。
冲突是一定会有的,只是出现的概率比较小,如果需要控制在一定范围内,就需要使用更具体的算法去散列它。

希望楼主看得懂我说的意思。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2