最近要给某个类写一个 hash 方法,这个类包括一些整型和字符串属性,需要把它们都放到 hash 中。担心自己想出来的 hash 算法会造成比较严重的冲突,网上搜了一下,发现 Effective Java 中已经介绍过一种简单有效的算法了:

  1. 将任一非零常数赋值给 result
  2. 找到该类中所有需要包含在 hash 中的属性,并根据它们的类型进行计算 c
    1. 对于布尔类型,将它们转换为 0/1
    2. 对于 byte, char, short, 和 int 类型,将它们转换为 int
    3. 对于长整型 long,计算高位和低位的异或结果 (int) (f ^ (f >>> 32))
    4. 对于 float 类型,采用它的二进制表示,在 Java 中为 Float.floatToIntBits,Ruby 中我估计用 Float.hash 也可以
    5. 对于 double 类型,调用 Double.doubleToIntBits 后再次用前面的方法处理得到的 long 类型
    6. 对于数组,利用方法 3 合并计算结果
    7. 对于其它的对象,递归调用该对象的 hash 方法
  3. 将计算结果合并到 result 变量:result = 37 * result + c
  4. 返回 result
另外这个博客的域名已经改成了 blog.yxwang.me,原来的域名 techblog.iamzellux.com 仍然可用,但会重定向到新的域名。