首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

大师过来看看Java中的Hash算法是否优秀?解决方案

2012-02-22 
大师过来看看Java中的Hash算法是否优秀? HashMap中的Hash算法有些不解,之前有人在CSDN提问过,但是没有明确

大师过来看看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

热点排行