Java 一种高效的hashcode函数

Java 一种高效的hashcode函数,java,hashcode,Java,Hashcode,我有一个Employee类,它具有许多属性。其中一个属性是employeeId,其类型为int 我可以为Employee提供如下hascode功能吗 int hashCode(){ return new Integer(employeeId).hashCode(); } 效率高吗?那么: return employeeId; 只要它的表现符合预期,并且没有给你带来任何问题,那么是的 编辑:查看并对hashCode()的唯一要求是它返回的值足够唯一,并且根据equals()相等的两个E

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

我可以为
Employee
提供如下hascode功能吗

int hashCode(){
    return new Integer(employeeId).hashCode();
}
效率高吗?

那么:

return employeeId;

只要它的表现符合预期,并且没有给你带来任何问题,那么是的


编辑:查看并

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


回答最初的问题,不,这不是很有效。如果您执行大量调用,新的对象构造将给您带来非常小的性能影响,尽管编译器(以及使用哈希代码的实现)可能足够聪明,可以优化其中一些。当然,只有当您大量使用它时,您才会看到这一点,而您通常不会这样做。

如果
employeeId
确实是
int
类型,那么这应该会起作用,并且比您的版本效率要高得多。。。无正当理由创建一个
整数
对象:

public int hashCode() {
    return employeeId;
}

如果
employeeId
是一个以字符串表示的整数,那么以下内容可能比您的版本更好

public int hashCode() {
    return Integer.parseInt(employeeId);
}
所有这些解决方案(包括您的)都假设
employeeId
是唯一的密钥;i、 e.没有两名员工(及其对应的
Employee
对象)具有相同的
employeeId
值。

不,这是无效的

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


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

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

return Integer.valueOf(employeeId).hashCode();
因为在某些情况下,这应该比新的更有效。
尽管我同意返回员工id是最好的解决方案。正如Mercy和Steven C所建议的那样。

我会对返回原始
员工ID有点谨慎。根据公司的不同,这样做很容易导致集群。一个明显的模式是,当事情进展顺利时,公司会雇佣很多人。然后,当事情进展不顺利时,他们会裁员,主要是按照与资历相反的顺序。然后,当情况再次好转时,他们又雇佣了更多的人


这意味着您将倾向于以相对密集的跑步和相对稀疏的跑步交替进行。即使你已经满足了哈希工作的要求,而且你已经很快地生成了一个哈希代码,但是这些项目的哈希表的性能可能受到不利影响。这会让你走上正确的道路@Lost和@parker:你能给我一些efficent的hascode函数吗?是的,返回一个整数是有效的。我不认为你能比这更有效。:)假设您的EmployeeID都是唯一的,这是一个很好的方法。@ako:它不仅有效,而且与
Integer的值完全相同。hashCode()
无论如何都会给您提供相同的值。@Suresh s:事实上,这是不危险的。在考虑散列代码时,您应该只使用不可变属性,否则,当员工的属性是散列映射中的键或是散列集的成员时,对其进行变异将导致其位于错误的存储桶中。此外,由于员工id几乎肯定是唯一标识员工的,因此在我看来,这似乎是一个理想的散列代码,因为你保证没有碰撞。不管怎样,不需要新的。Integer是一种基本类型。请小心,如果您的系统中有可能有两个Employee对象具有相同的Employee ID,但不是.equal(),那么最终会出现一些微妙且令人恼火的错误。@rursw1:No,
int
是一种基本类型
Integer
int
@Angelo的包装类:仅当
equals()
方法没有为它们返回
false
。否则,这很好。@Angelo,两个不等于的对象返回相同的哈希代码是完全有效的。你关于“微妙且令人恼火的bug”的说法是不正确的。为了进一步说明这一点:有人可能会看到hashcode看起来像employeeid,并假设它们总是一样的;其他人可能没有意识到其他人依赖于这样的行为并改变hashcode的含义。在生成hashcode时,最好将employeeId与一些任意常量异或。我们甚至可以在每次系统启动时更改xor值(因为哈希代码的持久化时间不应超过该时间)。我们希望用于将哈希代码映射到bucket的底层算法会考虑到这种可能性。我认为对Java库进行二次猜测是一个坏主意。@JeremyP的确:Java在用作桶索引之前,使用了一个应用于所有哈希代码的混合函数。