哈希函数
哈希函数的输入数据一般是巨量的,输出数据的的范围往往是有限的
哈希函数的输出存在均匀性,也就是无论输入是什么,输入是否接近,输出均匀分布在整个输出域之中。
哈希表处理冲突位置(映射)的方法
链接法:
- 对于经过哈希函数得到同一个index的数据,利用链表(或者类似的形式)将其串联起来,寻找的时候先进行哈希得到index,然后再该index对应的位置逐个遍历链表得到要找的对象
其他方法参考链接 参考
一致性哈希
用在给服务器分配数据问题减少迁移数据的工作量
一般情况下将输入数据的
key值进行哈希,哈希得到的结果对服务器的数量取模,按照取得的结果分配到不同的服务器上,但是此时假如增加或者减少了服务器,就会因为取模的数字变化导致整个系统的哈希取模的数字都需要重新计算和分配,进而整体前迁移,工作量很大引入一致性哈希得目的是减少上文描述得前移工作量
将三个机器的特征名称进行哈希,哈希过后将三个机器放在一个由哈希结果范围组成的环上(最大值和最小值头尾相接)。此时得到一个数据,同样将数据进行哈希,哈希得到的结果在环上找距离最近(此处的算法可以更换)的服务器存储该数据,假如数据的哈希值比所有服务器的哈希值都大的话就找哈希值最小的服务器,因为大小首尾相接。
增加机器
假如此时需要增加M4,那么只需要将M3和M4之间的数据迁移到M4即可,不需要将所有数据进行重新计算迁移。
潜在问题:
- 一开始的时候因为机器的地址是哈希得到的,未必均衡
- 增加机器之后可能导致局部机器比较密集,同样负载不均衡
解决上述问题的方法:虚拟节点技术
给每个服务器分配多个用于哈希的序列,每个服务器在环上具有多个对应的序列哈希得到的节点位置,相对均匀,同时也比较方便虚拟节点之间的数据迁移
不同的机器可以根据机器性能和状态的不同分配不同数量的虚拟节点,实现对于负载比例的不同分配。