在实现词典这种数据结构时,我们需要根据查找键来查找所对应的值,这就要求我们首先要能计算出查找键的的散列码,然后再将散列码压缩为散列表的索引。
查找键可以是一个类类型,也可以是字符串,也可以是基本类型。对于不同的类型有不同
的计算方法,下面做一下总结:
一 类类型的散列码的计算
JAVA的基类Object类中有一个方法hasCode( ),它返回一个整数散列码。所以JAVA中每个类都有此方法,但是一般我们需要重写此方法。因为此方法是根据对象的内存地址来返回一个散列码,这样内容相同的对象就返回了不同的散列码,因此要遵循覆盖次方法的一些则:
1)如果某个类覆盖了equals(),那么它也应该覆盖hansCode()
2)如果equals() 返回相同的值,那么hasCode()也应该返回相同的值。
3)在同一个程序的两次执行中,对象的散列码可以不同。
二 字符串的散列码的计算
对于字符串散列码的计算一般采用如下方法:将每个字符的Unicode值乘以一个该字符在字符串的位置的因子,散列码就是所有这些乘积的和。JAVA中的String的hasCode()就是用
一个常数31作为因子。
三 基本类型的散列码的计算
对于基本类型的散列码的计算,一般都是采用转化为int型的。在JAVA中对于long型的数据,一般用是用移位操作将64位的值转换为32位的int值。对于double和float类型一般用其封装类的Double.doubleToLongBits(key)或者是Float.floatToLongBits(key),然后通过移位和异或
来完成:(int)bits^(bits>>>32)
最后一个问题就是将散列码压缩为散列表的索引,对于这个问题通常的做法就是求模。但是一般为了元素能均匀的分配到散列表,一般散列表的元素的个数要是素数。