竹子听

hash2

 

斐波那契(Fibonacci)散列法

  平方散列法的缺点是显而易见的,所以我们能不能找出一个理想的乘数,而不是拿value本身当作乘数呢?

  1,对于16位整数而言,这个乘数是40503。

  2,对于32位整数而言,这个乘数是2654435769。

  3,对于64位整数而言,这个乘数是11400714819323198485。

  这几个“理想乘数”是如何得出来的呢?这跟一个法则有关,叫黄金分割法则,而描述黄金分割法则的最经典表达式无疑就是著名的斐波那契数列,即如此形式的序列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,…。另外,斐波那契数列的值和太阳系八大行星的轨道半径的比例出奇吻合。

  对我们常见的32位整数而言,公式: 

  index = (value * 2654435769) >> 28

  如果用这种斐波那契散列法的话,那上面的图就变成这样了:

  很明显,用斐波那契散列法调整之后要比原来的取摸散列法好很多

评论