• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 基于一致性hash算法 C++语言的实现详解

基于一致性hash算法 C++语言的实现详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了一致性hash算法,一致性hash,一致性hash原理,mycat 一致性hash,java 一致性hash等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

    一致性hash算法实现有两个关键问题需要解决,一个是用于结点存储和查找的数据结构的选择,另一个是结点hash算法的选择。

    首先来谈一下一致性hash算法中用于存储结点的数据结构。通过了解一致性hash的原理,我们知道结点可以想象为是存储在一个环形的数据结构上(如下图),结点A、B、C、D按hash值在环形分布上是有序的,也就是说结点可以按hash值存储在一个有序的队列里。如下图所示,当一个hash值为-2^20的请求点P查找路由结点时,一致性hash算法会按hash值的顺时针方向路由到第一个结点上(B),也就是相当于要在存储结点的有序结构中,按查询的key值找到大于key值中的最小的那个结点。因此,我们应该选择一种数据结构,它应该高效地支持结点频繁地增删,也必须具有理想的查询效率。那么,红黑树可以满足这些要求。红黑树是一颗近似平衡的一颗二叉查找树,因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。 因此,我们选择使用红黑树作为结点的存储结构,除了需要实现红黑树基本的插入、删除、查找的基本功能,我们还应该增加另一个查询lookup函数,用于查找大于key中最小的结点。

image

   接下来,我们来说hash算法的选择。一致性hash算法最初提出来,就是为了解决负载均衡的问题。每个实体结点会包含很多虚拟结点,虚拟结点是平衡负载的关键。我们希望虚拟结点可以均衡的散列在整个“环”上,这样不仅可以负载到不同hash值的路由请求,还可以当某个结点down掉,原来路由到down掉结点的请求也可以较均衡的路由到其他结点而不会对某个结点造成大量的负载请求。这里,我们选择使用MD5算法。通过MD5算法,可以将一个标示串(用于标示虚拟结点)转化得到一个16字节的字符数组,再对该数组进行处理,得到一个整形的hash值。由于MD5具有高度的离散性,所以生成的hash值也会具有很大的离散性,会均衡的散列到“环”上。

   笔者用C++语言对一致性hash算法进行了实现,下面我将会描述下一些关键细节。

1、首先定义实体结点类、虚拟结点类。一个实体结点对应多个虚拟结点。

  实体结点 CNode_s:

</div>
2、hash算法具有可选择性,定义一个hash算法接口,方便以后进行其他算法的扩展。

      这里创建MD5hash类,并继承该接口,通过MD5算法求hash值。

类图:

image  

CHashFun接口:
            if(key <=

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 常用Hash算法(C语言的简单实现)
  • 基于一致性hash算法 C++语言的实现详解

相关文章

  • 2017-05-28c病毒程序原理分析(防范病毒 c语言小病毒示例)
  • 2022-04-30C语言数据类型转换(自动类型转换+强制类型转换)
  • 2017-05-28一般函数指针和类的成员函数指针深入解析
  • 2017-05-28linux系统中c++写日志文件功能分享
  • 2017-05-28关于define与C 的内存
  • 2017-05-28c++ *运算符重载
  • 2017-05-28直观理解C语言中指向一位数组与二维数组的指针
  • 2017-05-28c++类构造函数详解
  • 2017-05-28C++ read函数读入int整形数据
  • 2017-05-28C++学习小结之数据类型及转换方式

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 关于数组做函数参数的问题集合汇总
    • C语言实现带头结点的链表的创建、查找、插入、删除操作
    • C++时间戳转换成日期时间的步骤和示例代码
    • VC下实现fopen支持中文的方法
    • C++之类的静态变量
    • 指向类成员函数的指针其实并非指针
    • 让应用程序只运行一个实例的实现方法
    • c语言二进制数按位输出示例
    • 下标操作符重载模拟多维数组详解
    • DSP中浮点转定点运算--浮点数的存储格式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有