一致性哈希 与 普通哈希对比

普通哈希算法

假如有cache主机5台分别为cacheA、cacheB、cacheC、cacheD、cacheE

当程序进行hash时,首先每个节点要根据自己的唯一参数哈希出一个值来(如根据ip进行哈希)

主机哈希完成后形成的哈希值如下

cacheA       0

cacheB       1

cacheC       2

cacheD       3

cacheE       4

主机形成哈希值后,我们以缓存来做实例,比如某个用户登录后会有一个唯一的pin值,然后根据

这个pin值进行hash求余。因为求余是用5来求余,所以数值肯定会小宇5 因此就有了落点,然后把

缓存数据进行缓存到落点服务器中

一致性哈希算法

假如有cache主机5台分别为cacheA、cacheB、cacheC、cacheD、cacheE

当程序进行hash时,首先每个节点要根据自己的唯一参数哈希出一个值来(如根据ip进行哈希)

主机哈希完成后形成的哈希值如下

cacheA       key1

cacheB       key2

cacheC       key3

cacheD       key4

cacheE       key5

然后5台节点围绕称一个环形,如图

主机形成哈希值后,我们以缓存来做实例,比如某个用户登录后会有一个唯一的pin值,然后根据

这个pin值进行hash。这里注意和普通hash不一样的就是这里只hash不求余,当hash出一个数值

后,查看这个这个值介于那两个值之间比如介于key4和key5之间,然后从这个落点开始顺时针查

找遇到第一个cache服务器后就把这个服务器当作此次缓存的落点,从而把这个缓存放到这个落点

上。如图:

两者比较:

经过上面的介绍我们能看出,假如普通的哈希当其中任意一台机器down掉后,我们整个的

缓存都将安然无存,为什么这么说呢?

因为当某台cache down掉后我们需要重选算落点,除数已经变了,所以都要重新set缓存,

当然不排除有一些两个pin值算的落点是一样的,但是当cache服务器增加到一定数量后,前面所

说的可能性几乎为0,所以称之为全部缓存都要重新set。

而使用一致性哈希当其中一台机器down掉后,只有它上面到它这一段的环路缓存失效了,如:

当cache3 down掉后,那落掉在cache2到cache3之间的pin都将失效,那么失效的落点讲继续顺时

针查找cache服务器,那么新的落点都将落到cache4上。

一致性哈希 与 普通哈希对比

时间: 2024-11-05 21:36:30

一致性哈希 与 普通哈希对比的相关文章

算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀分布,哈希函数的离散性,打乱输入规律 public class Code_01_HashMap { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.p

哈希函数和哈希表综述 (转)

哈希表及哈希函数研究综述 摘要 随着信息化水平的不断提高,数据已经取代计算成为了信息计算的中心,对存储的需求不断提高信息量呈现爆炸式增长趋势,存储已经成为急需提高的瓶颈.哈希表作为海量信息存储的有效方式,本文详细介绍了哈希表的设计.冲突解决方案以及动态哈希表.另外针对哈希函数在相似性匹配.图片检索.分布式缓存和密码学等领域的应用做了简短得介绍 哈希经过这么多年的发展,出现了大量高性能的哈希函数和哈希表.本文通过介绍各种不同的哈希函数的设计原理以及不同的哈希表实现,旨在帮助读者在实际应用中,根据问

数据结构与算法——哈希函数与哈希表等(1)

认识哈希函数和哈希表的实现 MD5 表达16^16范围的值 SHal 表达16^32范围的值 输入相同,即输出相同,不随机 不同的输出,输出相同 均匀性,离散性 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; public class HashMap { public static void main(String[] args) {

哈希桶处理哈希冲突

哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),我们可以把每个key的位置看作是一个指针,该指针所指向的位置里放了一个链表,可以认为是指针数组,故该方法也叫开链式. 相比闭散列,哈希桶提高了空间利用率:在实现哈希表时,常见的方法是线性探测.二次探测,这两个算法的具体实现可以查看我的博客.但是这两个算法有一个共同点就是:空间利用率低.为什么这么说呢?线性探测.二次探测的高效性很大程度上要取决于它的载荷因子,载荷因子即:存放关键字个数 / 空间大小. 通过查阅资料,我发现,使用素数做除数可

哈希算法下——哈希算法在分布式系统中有哪些应用?

1. 应用五:负载均衡 负载均衡算法有很多,比如论询.随机.加权轮询等.那如何才能实现一个会话粘滞(session sticky)的负载均衡算法呢?也就是说,我们需要在同一个客户端上,把在一次会话中的所有请求都路由到同一个服务器上. 最直接的方法就是,维护一张映射关系表,这张表的内容是客户端 IP 地址或者会话 ID 与服务器编号的映射关系.客户端每次发出请求时,就从映射表中查找到对应的服务器编号,然后再请求该编号的服务器.这种方法简单直观,但也有几个弊端: 客户端很多的话映射表就会很大,比较浪

算法中,什么是哈希值,哈希值怎么生成的,有什么用?

1.你可以把哈希值简单地理解成是一段数据(某个文件,或者是字符串)的DNA,或者身份证: 2.通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值.他有这样一个特点,他是唯一的,一旦大数据发生了变化,哪怕是一个微小的变化,他的哈希值也会发生变化.另外一方面,既然是DNA,那就保证了没有两个数据的哈希值是完全相同的. 3.正是因为这样的特点,它常常用来判断两个文件是否相同.比如,从网络上下载某个文件,只要把这个文件原来的哈希值同下载后

全域哈希和完全哈希

1.直接映射表 查找数据时,直接定位,时间复杂度为:O(1): 局限性:浪费大量的内存空间: 2.哈希表 (1).用一个哈希函数Hash()来随机映射那些键: 抽象模型 (2).哈希冲突时: i.链地址法,时间复杂度最坏:O(n): 简单均匀哈希的时间复杂度:O(1+a):a:装载因子 哈希函数的选取:除留余数法: ii.开放寻址法,没有链表: 利用多次哈希函数,探测空的位置,直到找到一个可以存放元素的位置即可:探查序列很重要!!! 插入.查询就根据探查序列比较简单,删除比较难做: 探测序列:a

哈希函数和哈希表

哈希函数:将一个哈希表中的关键字映射成该关键字对应地址的函数.而hash函数应尽量减少冲突 哈希表建立了关键字和存储地址的映射. 哈希函数的方法: 直接定址法,除留余数法,数字分析法,平方取中法,折叠法 处理冲突的方法 开放定址法: 线性探测(容易聚集和堆积) 平方探测 拉链法:

【Python算法】哈希存储、哈希表、散列表原理

哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中. 查找时再根据要查找的关键字采用同样的函数计算出哈希地址,然后直接到相应的存储单元中去取要找的数据元素即可. 哈希表的应用: 哈希表(hash table)是实现字典操作的一种有效的数据结构. 尽管最坏的情况下,散列表中查找一个元素的时间与链表中查找的时间相同,达到了O(n). 然而实际应用中,散