Aiur

zellux 的博客

一个简单有效的 hash 算法

最近要给某个类写一个 hash 方法,这个类包括一些整型和字符串属性,需要把它们都放到 hash 中。担心自己想出来的 hash 算法会造成比较严重的冲突,网上搜了一下,发现 Effective Java 中已经介绍过一种简单有效的算法了: 将任一非零常数赋值给 result 找到该类中所有需要包含在 hash 中的属性,并根据它们的类型进行计算 c 对于布尔类型,将它们转换为 0/1 对于 byte, char, short, 和 int 类型,将它们转换为 int 对于长整型 long,计算高位和低位的异或结果 (int) (f ^ (f >>> 32)) 对于 float 类型,采用它的二进制表示,在 Java 中为 Float.floatToIntBits,Ruby 中我估计用 Float.hash 也可以 对于 double 类型,调用 Double.doubleToIntBits 后再次用前面的方法处理得到的 long 类型 对于数组,利用方法 3 合并计算结果 对于其它的对象,递归调用该对象的 hash 方法 将计算结果合并到 result 变量:result = 37 * result + c 返回 result 另外这个博客的域名已经改成了 blog. 阅读全文 →