什么是 Hash
Hash(哈希),又称“散列”。
散列(hash)英文原意是“混杂”、“拼凑”、“重新表述”的意思。
在某种程度上,散列是与排序相反的一种操作,排序是将集合中的元素按照某种方式比如字典顺序排列在一起,而散列通过计算哈希值,打破元素之间原有的关系,使集合中的元素按照散列函数的分类进行排列。
在介绍一些集合时,我们总强调需要重写某个类的 equlas() 方法和 hashCode() 方法,确保唯一性。这里的 hashCode() 表示的是对当前对象的唯一标示。计算 hashCode 的过程就称作 哈希。
为什么要有 Hash
我们通常使用数组或者链表来存储元素,一旦存储的内容数量特别多,需要占用很大的空间,而且在查找某个元素是否存在的过程中,数组和链表都需要挨个循环比较,而通过 哈希 计算,可以大大减少比较次数
一致性哈希
一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。
简单的理解,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下,从 0 ~ 2^32-1 代表的分别是一个个的节点,这个环也叫哈希环。
hash(服务器A的IP地址) % 2^32
哈希环可以解决:
1,当某个服务器节点宕机时,原来的数据存储更少的变动。
通过哈希环,利用哈希函数并对结果取模的操作,映射到哈希环上,按顺时针遇到的第一个节点即为该数据存储位置。这样增加或者减少服务器节点时候,只需要改变少部分数据的存储位置。
2,数据倾斜问题。
通过对实际的物理节点建立多个虚拟节点,将虚拟节点通过哈希函数映射到哈希环上。这样因为哈希函数保证了所有虚拟节点在2^32上均匀分布的,所以当服务器宕机或者新增节点后,能保证数据存储也是均匀的,解决了数据存储不平衡问题。
同时,还可以通过控制虚拟节点的数量来管理负载。服务器节点性能较好,分配多点虚拟节点
服务器性能较差,分配少一些虚拟节点。