Murmurhash: 是一种非加密型哈希函数,适用于一般的哈希检索操作。高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法。

一致性哈希算法的主要步骤:

  1. 首先求出缓存服务器结点的哈希值,将其映射到0~2^32的环上;
  2. 然后用同样的方法求出存储数据的键的哈希值,并映射到环上;
  3. 最后是从数据映射的位置顺时针查找,将数据发送给找到的第一个服务器上。

一、一致性哈希原理:

根据上述对于一致性哈希算法思想以及步骤的描述,它的基本原理及过程如图1所示:

二、处理哈希偏斜:

由于每个服务器在环上的分布是不均匀的,所以就有可能会存在哈希偏斜的问题,如图2所示;解决这一问题所采用的方法就是引用虚拟结点;如果这三个服务器按照如图2的样子进行排列,那么在0~1之间的哈希值都会交给1进行处理,1~ 2之间的哈希值都会交给2进行处理,2~0之间的哈希值都会交给0进行处理,这样导致的结果就是0的负载是太大,当0服务器撑不住崩溃后,会陆续使得1和2的负载增大导致整个服务器集群崩溃这种分布就称为哈希偏斜;

所以我们引入虚拟结点,解决这一问题;这样2~1之间的哈希值就不会全部交给0来处理,而是照样根据顺序查找,当查找到某虚拟结点时,根据结点之间的关系映射到真实的结点上让其进行处理;

三、一致性哈希的优点

相比于直接哈希来讲,一致性哈希算法的优点在于每个服务器都不会受到其他服务的增加或删除的影响。对于一致性哈希,当需要从环中删掉一个服务器时,其他的服务器不会被其干扰,删除后的结果就是,删除点的下一个服务器所处理的范围除了原来的部分之外,还增加了删除的那台服务器所需要处理的部分。但这并不影响剩下的服务器正常工作 ;相应的,当需要在环中增加一个结点时,增加的结果就是增加点的下一个服务器的处理范围减小,减少的部分由增加的服务器进行处理,同样并不影响其他的服务器正常工作;如下图3所示:

四、一致性哈希的特点

均衡性(Balance)

平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

单调性(Monotonicity)

单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。(这段翻译信息有负面价值的,当缓冲区大小变化时一致性哈希(Consistent hashing)尽量保护已分配的内容不会被重新映射到新缓冲区。)简单的哈希算法往往不能满足单调性的要求,如最简单的线性哈希:x → ax + b mod (P)在上式中,P表示全部缓冲的大小。不难看出,当缓冲大小发生变化时(从P1到P2),原来所有的哈希结果均会发生变化,从而不满足单调性的要求。

哈希结果的变化意味着当缓冲空间发生变化时,所有的映射关系需要在系统内全部更新。而在P2P系统内,缓冲的变化等价于Peer加入或退出系统,这一情况在P2P系统中会频繁发生,因此会带来极大计算和传输负荷。单调性就是要求哈希算法能够应对这种情况。

分散性(Spread)

在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

负载(Load)

负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

【算法】哈希算法——murmurhash一致性哈希算法相关推荐

  1. 哈希算法——murmurhash一致性哈希算法

    Murmurhash: 是一种非加密型哈希函数,适用于一般的哈希检索操作.高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx. ...

  2. [转]哈希分布与一致性哈希算法简介

    哈希分布与一致性哈希算法简介 作者:liunx 来源:http://www.cnblogs.com/liunx/archive/2010/03/24/1693925.html 前言 在我们的日常web ...

  3. 哈希分布与一致性哈希算法简介

    前言 在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了.相信memcache的基本原理大家也都了解过了,memcache虽然是分布式的应用服务,但分布的原则是由clien ...

  4. 算法高级(24)-一致性哈希算法在分布式系统中的使用场景

    本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用. 一.一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人 ...

  5. 负载均衡一致性哈希算法实现 | nginx 负载均衡一致性哈希源码分析 | ngx_http_upstream_consistent_hash_module 源码分析

    这是本学期分布式计算/系统课程负载均衡节的课后作业,理解七层反向代理的负载均衡 Nginx 中使用的的一致性哈希算法.开头只是讲一些没用的东西,后面主要是分析 Nginx 的 O(1) 时间复杂度的一 ...

  6. 哈希分布与一致性哈希算法—在swift中看到这个有意思的算法

    在研究swift的基本原理时,看到了这个算法,不怎么明白,找了几个帖子来学习.感谢@博客园一条辉的博客(liunx.cnblogs.com) @sparkliang 前言 在我们的日常web应用开发当 ...

  7. 【hash】哈希算法、哈希碰撞、一致性哈希

    一.hash算法 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长 ...

  8. 哈希冲突和一致性哈希

    文章目录 哈希冲突 处理哈希冲突 1.开放地址法 2.再散列法 3.链地址法 4 建立一个公共溢出区 一致性哈希 普通 hash算法 普通 hash 算法的缺陷 一致性哈希算法 一致性 hash 算法 ...

  9. 哈希函数与一致性哈希

    什么是 Hash Hash(哈希),又称"散列". 散列(hash)英文原意是"混杂"."拼凑"."重新表述"的意思. ...

最新文章

  1. java中抽象接口_一篇文章让你彻底理解java中抽象类和接口
  2. angular-JS模仿Form表单提交
  3. Oracle行列转换小结
  4. [css] 如何让一个块元素绝对居中?
  5. 卷起来了!DeepMind发布媲美普通程序员的AlphaCode,同日OpenAI神经数学证明器拿下奥数题...
  6. [Winform] DataGridView辅助类
  7. selenium自动化测试-1.selenium介绍及环境安装
  8. Flask运行时Unicode编码错误
  9. hadoop 如何连beeline_impala为hadoop续命
  10. 在linux本地下载ftp中的文件
  11. 静音抑制_正在研究利润以抑制创新
  12. STC12C5A60S2-定时器+数码管
  13. coldfusion php,将一些PHP移植到ColdFusion
  14. Leetcode力扣 MySQL数据库 1132 报告的记录II
  15. C++程序设计的技巧-Pimple的使用
  16. 动物识别系统的规则库
  17. 51、【网工必备】两种常见网络拓扑图介绍,一看就会
  18. 学计算机女生考研什么专业好就业,适合女生考研易就业的十大专业有哪些
  19. iOS中 扫描二维码/生成二维码详解
  20. 武汉光庭导航面试经历

热门文章

  1. echarts 折线图 设置y轴最小刻度_手把手教你玩转echarts(二)折线图
  2. 自动化测试框架Pytest(一)——入门
  3. 李宏毅-Transformer
  4. 怎样上幼儿园电脑计算机课,幼儿园电脑课堂常规要求教案
  5. vue-qr 二维码 批量 导出
  6. 【安全牛学习笔记】CSRF跨站请求伪造攻击漏洞的原理及解决办法
  7. Pytorch应用之——人民币总结
  8. AngularJS 实践:应用开发 :: ENA13 价格条码-(四)
  9. Java csv文件中文乱码问题解决办法
  10. linux 软件源 镜像源 yum apt pip