数据结构与算法题目总结(三)

7. 哈希算法与一致性哈希

    7.1什么是哈希算法:

        哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。

    7.2常见的哈希算法:

        ① 除法哈希法

            公式:hash(key) = key mod M

        ② 乘法哈希法

            公式:hash(key) = floor( W * ( A * K mod 1) )

            1. 用关键字 K 乘上常数 A (0

            2. 然后再用 W 乘以这个值,再向下去整。(W的取值规定了hash的长度,一般为2的某个幂次方)

        ③ 斐波那契(Fibonacci)哈希法

            斐波那契散列法本质上是一个乘法散列法,特殊的是它采用一个特殊的乘数,选择的这个乘数和黄金分割比例密切相关;

数据结构与算法题目总结(三)_第1张图片

    7.3哈希碰撞的解决方法:(明哥上一节介绍过,此处不细讲)

        方案1:线性探测法:(开放寻址法的一种,缺点更费内存,且扩容时需要搬迁数据)

        方案2:拉链法(链地址法)

    7.4一致性哈希算法

        应用场景:我们用 HASH(图片名称)%N 将3W张图片均匀缓存在3台缓存服务器上,如果缓存服务器挂掉/新增1台呢?那么势必会造成缓存雪崩,于是一致性哈希算法应运而生

        基本概念:一致性哈希算法也是使用取模的方法,只不过将服务器数量换成了对2^32取模。

        我们将2^32想象成一个圆,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到2^32-1,也就是说0点左侧的第一个点代表2^32-1 。我们把这个由2的32次方个点组成的圆环称为Hash环。

        确定A,B,C三台服务器和图片的位置,图片将会被缓存到它顺时针碰到的第一个服务器上,也就是A。这就是一致性哈希算法

数据结构与算法题目总结(三)_第2张图片

        优点:当服务器数量发生变化时,只有部分缓存失效,不会产生雪崩情况

        哈希环的倾斜:在实际的映射中,服务器可能会被映射成下图左模样,被缓存的对象大部分集中缓存在A上。假如此时服务器A出现故障,那么失效缓存的数量也将达到最大值,在极端情况下,仍然有可能引起系统的崩溃。这种情况则被称之为hash环的偏斜

        虚拟节点:那么我们应该怎样防止hash环的偏斜呢?一致性hash算法中使用"虚拟节点"解决了这个问题。就是凭空的让服务器节点多起来,既然没有多余的真正的物理服务器节点,我们就只能将现有的物理节点通过虚拟的方法复制出来,这些由实际节点虚拟复制而来的节点被称为"虚拟节点"。加入虚拟节点以后的hash环如下:


数据结构与算法题目总结(三)_第3张图片

        "虚拟节点"是"实际节点"(实际的物理服务器)在hash环上的复制品,一个实际节点可以对应多个虚拟节点。从上图可以看出,A、B、C三台服务器分别虚拟出了一个虚拟节点。当然,如果你需要,也可以虚拟出更多的虚拟节点。引入虚拟节点的概念后,缓存的分布就均衡多了。

你可能感兴趣的:(数据结构与算法题目总结(三))