我在面试中遇到了一些情况,我需要使用整数或字符串的哈希函数.在这种情况下,我们应该选择哪些?我在这些情况下出错了,因为我最终选择了那些产生大量碰撞的东西,然后哈希函数往往是数学的,你不能在面试中回忆一下.有没有一般的建议,至少面试官对你的整数或字符串输入的方法感到满意?在“采访情况”中,哪些功能对于两个投入都是足够的
解决方法
这是
Effective java page 33的简单食谱:
>在一个称为result的int变量中存储一些常量的非零值,例如17.
>对于您对象中的每个重要字段f(每个字段由…所考虑
equals方法,即),执行以下操作:
>
计算字段的int哈希码c:
>如果该字段是一个布尔值,则计算(f?1:0).
>如果字段是一个字节,char,short或int,则compute(int)f.
>如果字段长,compute(int)(f ^(f>>> 32)).
>如果该字段是浮点数,则计算Float.floatToIntBits(f).
>如果字段是双精度,则计算Double.doubleToLongBits(f)和
然后如步骤2.1.iii中的哈希结果长.
>如果该字段是一个对象引用和该类的equals方法
通过递归地递归调用equals比较该字段
在字段上调用hashCode.如果比较复杂的话
需要,计算这个字段的“规范表示”
在规范表示上调用hashCode.如果值的话
字段为null,返回0(或其他一些常量,但是0是传统的).
所有对象共同的方法
>如果该字段是数组,则将其视为每个元素都是单独的字段.
也就是说,通过应用来计算每个有效元素的哈希码
这些规则是递归的,并且每个步骤2.b组合这些值.如果每一个
元素中的数组域很重要,可以使用其中的一个
在版本1.5中添加的Arrays.hashCode方法.
>将步骤2.1中计算的哈希码c与以下结果相结合:
result = 31 * result c;
>返回结果.>完成编写hashCode方法后,问问自己相等的实例具有相等的哈希码.编写单元测试来验证你的直觉!如果相等的实例具有不等的哈希码,可以弄清楚为什么并解决问题.