Java中的哈希值

一、Hash值有什么用?数组

     HashMap、HashTable、HashSet,因此涉及到使用Hash值进行优化存储的地方,都会用到HashCode。HashCode是Key,这种计算为提升计算的性能。想一想看,通常来讲,数组算是比较快的集合类了吧,直接用index定位元素,简直就是O(1)的级别。可是添加元素就不这么乐观了。可是使用hash类的集合,添加元素,移动的元素少,只影响一小块,而且查找元素,因为hash值已经进行了定位分组,因此也会大大缩小涉及面,快速定位。性能

 

二、Hash值应该符合什么原则?优化

     A、等幂性。无论执行多少次获取Hash值的操做,只要对象不变,那么Hash值是固定的。若是第一次取跟第N次取不同,那就用起来很麻烦,须要记录当前是第几回操做,这种须要记录状态的事情,可不是什么好事。code

     B、对等性。若两个对象equal方法返回为true,则其hash值也应该是同样的。举例说明:若你将objA做为key存入HashMap中,而后new了一个objB。在你看来objB和objA是一个东西(由于他们equal),可是使用objB到hashMap中却取不出来东西。对象

     C、互异性。若两个对象equal方法返回为false,则其hash值最好也是不一样的,但这个不是必须的,只是这样作会提升hash类操做的性能(碰撞概率低)。hash

 

三、Hash值应该怎么计算?方法

   A、简单计算就是组成成员的hash值直接相加便可。好比ObjectA有三个属性,propA、propB和propC,最直接的计算方式就是propA.hashcode+propB.hashcode+propC.hashcode。集合

 

   B、可是若是遇到有顺序相关的怎么办?好比String类型是由char数组组成,而且这些数组是有顺序的。若是使用第一种计算方法,则“ABCD”和“BCDA”就会产生一样的hashCode,那么怎么办呢?最直接想到的办法就是加权,不一样的index加不一样的权值,这个权值的肯定最直接的方法就是某个常数值的几回幂。好比为String的计算hash值为K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的选择也有说法,最好不要是偶数,由于偶数的相乘会形成信息的丢失(乘以2就是左移1位,一旦溢出就会形成信息的丢失,这种计算会形成溢出后的值与某个看似不相关的数值获得的结果是同样的),因此最好是奇数,在这一点上比较推荐使用7,由于7=8-1=2^3-1,这样计算的时候,直接左移几位再进行一次普通的加减法便可(Java中经常使用的是31(32-1=2^5-1))。移动

相关文章
相关标签/搜索