大师过来看看Java中的Hash算法是否优秀?
HashMap中的Hash算法有些不解,之前有人在CSDN提问过,但是没有明确的解释
HashMap的算法是,先用自己提供的hash方法对object的hashCode进行处理(就是说不论你的object的hash算法有多好,都要转化成HashMap的)
其方法是
static int hash(Object x) {
int h = x.hashCode();
h += ~(h < < 9);
h ^= (h > > > 14);
h += (h < < 4);
h ^= (h > > > 10);
return h;
}
对于这个的理解问题,倒是不大,但是在确定最后桶的位置的时候,使用的方法让人不解。
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}
一个“与”操作就完事了吗?我们知道Hash的最后一步一般跟桶的数量取模。
我做了一点测试,大家看看结果,好像他的算法不如取模算法好
代码如下:
public class TestAnd
{
public static void main(String[] args)
{
for(int i=0;i <15;i++){
int hash=hash(new Integer(i));
int index=indexFor(hash,11);
System.out.println( "i= "+i+ " mod= "+(i%11)+ " hash= "+hash+ " index= "+index);
}
System.out.println( "Hello World! ");
}
static int hash(Object x) {
int h = x.hashCode();
h += ~(h < < 9);
h ^= (h > > > 14);
h += (h < < 4);
h ^= (h > > > 10);
return h;
}
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}
}
运行结果如下:
i=0 mod=0 hash=-8130816 index=0
i=1 mod=1 hash=-8139033 index=2
i=2 mod=2 hash=-8147762 index=10
i=3 mod=3 hash=-8156460 index=0
i=4 mod=4 hash=-8165219 index=8
i=5 mod=5 hash=-8173951 index=0
i=6 mod=6 hash=-8182616 index=8
i=7 mod=7 hash=-8191310 index=2
i=8 mod=8 hash=-8200133 index=10
i=9 mod=9 hash=-8200661 index=10
i=10 mod=10 hash=-8209406 index=2
i=11 mod=0 hash=-8218088 index=8
i=12 mod=1 hash=-8226735 index=0
i=13 mod=2 hash=-8235443 index=8
i=14 mod=3 hash=-8244124 index=0
请大师指点。
[解决办法]
如果length是2^n
h&(length-1)等价于h%length