高效的哈希码函数

时间:2010-08-17 14:28:49

标签: java hashcode

我有一个具有许多属性的Employee类。其中一个属性是employeeId,其类型为int

我可以为Employee设置hascode函数,如下所示吗?

int hashCode(){
    return new Integer(employeeId).hashCode();
}

有效吗?

7 个答案:

答案 0 :(得分:17)

怎么样:

return employeeId;

答案 1 :(得分:2)

hashCode()的唯一要求是它返回的值足够唯一,并且根据equals()相等的两个Employee实例具有相同的哈希码。因此,在这种情况下返回employeeId是更好的选择。

回答原来的问题,不是效率不高。如果您正在进行大量调用,新对象构造将为您提供非常小的性能影响,尽管编译器(以及使用哈希代码的实现)可能足够智能以优化其中的一些。当然,如果你大量使用它,你只能看到它,而你通常不会这样做。

答案 2 :(得分:2)

如果employeeId确实属于int类型,那么这应该有效,并且它比您的版本更有效...它创建了一个Integer对象,没有充分的理由:< / p>

public int hashCode() {
    return employeeId;
}

如果employeeId是一个表示为String的整数,则以下内容可能比您的版本更好。

public int hashCode() {
    return Integer.parseInt(employeeId);
}

所有这些解决方案(包括您的解决方案)都假定employeeId是唯一的密钥;即没有两名员工(及其相应的Employee个对象)具有相同的employeeId值。

答案 3 :(得分:2)

我会对返回原始EmployeeID有点警惕。根据公司的不同,这样做很容易导致集群化。一个明显的模式是,当事情进展顺利时,公司雇用了很多人。然后,当事情进展不顺利时,他们会让人们失望,基本上与资历相反。然后,当事情再次回升时,他们会再招聘更多的人。

这意味着你将倾向于以相对密集的运行与相对稀疏的运行交替。即使您已经满足了哈希工作的要求并且您已经非常快速地生成了哈希代码,但这些项目的哈希表的性能可能会受到不利影响。

答案 4 :(得分:1)

不,它效率不高。

当客户端调用此hashCode()时,将创建一个新对象。

您的employeeId是一个int类型,只返回它,不需要新的Integer对象。

答案 5 :(得分:0)

只要它按预期执行,并没有给你任何问题,那么是。

编辑:查看http://mindprod.com/jgloss/hashcode.htmlhttp://www.javamex.com/tutorials/collections/hash_function_guidelines.shtml

答案 6 :(得分:0)

我不这么认为,我知道Java应该在西方拥有最快的新对象分配,但它是不必要的分配。假设具有相同值的2个整数对象将返回相同的哈希码,我没有看到它不会的原因,但是读取Javadoc,我没有看到任何语言会强制它们具有相同的哈希码,我相信Findbugs建议使用

return Integer.valueOf(employeeId).hashCode();

因为在某些情况下应该比新的更有效。 虽然我同意返回员工ID是最好的解决方案。正如Mercy和Steven C所暗示的那样。