python有一个python模块--hash_ring,即python中的一致性hash,使用起来也挺简单。

可以参考下官方例子:https://pypi.python.org/pypi/hash_ring/

  1. Basic example of usage (for managing memcached instances):
  2.  
  3. memcache_servers = ['192.168.0.246:11212',
  4. '192.168.0.247:11212',
  5. '192.168.0.249:11212']
  6.  
  7. ring = HashRing(memcache_servers)
  8. server = ring.get_node('my_key')
  9. Example using weights:
  10.  
  11. memcache_servers = ['192.168.0.246:11212',
  12. '192.168.0.247:11212',
  13. '192.168.0.249:11212']
  14. weights = {
  15. '192.168.0.246:11212': 1,
  16. '192.168.0.247:11212': 2,
  17. '192.168.0.249:11212': 1
  18. }
  19.  
  20. ring = HashRing(memcache_servers, weights)
  21. server = ring.get_node('my_key')

由于项目中其他代码使用的是C编写的Conhash.lib,测试后发现,hash_ring和conhash.lib hash出来的值不一样;

据说可以与C语言很好交互,Google后,果然可以,于是参考:官网ctypes介绍,花了点时间将通过python成功调用

了conhash接口,测试成功,代码如下(比较混乱,暂未整理):

  1. from ctypes import *
  2. import os
  3. from ctypes.util import find_library
  4.  
  5. class _Util_Rbtree_Node_S(Structure):
  6. pass
  7.  
  8. _Util_Rbtree_Node_S._fields_ = [('key',c_long),
  9. ('parent',POINTER(_Util_Rbtree_Node_S)),
  10. ('right',POINTER(_Util_Rbtree_Node_S)),
  11. ('left',POINTER(_Util_Rbtree_Node_S)),
  12. ('color',c_int),
  13. ('data',c_void_p)]
  14.  
  15. class _Util_Rbtree_S(Structure):
  16. _fields_ = [('root',POINTER(_Util_Rbtree_Node_S)),
  17. ('null',_Util_Rbtree_Node_S),
  18. ('size',c_uint)]
  19.  
  20. class _ConHash_S(Structure):
  21. _fields_ = [('vnode_tree',_Util_Rbtree_S),
  22. ('ivnodes',c_uint),
  23. ('cb_hashfunc',CFUNCTYPE(c_long,c_char_p))]
  24.  
  25. class _Node_S(Structure):
  26. _fields_ = [('iden',c_char * 64),
  27. ('replicas',c_uint),
  28. ('flag',c_uint),]
  29.  
  30. class ConHash:
  31. def __init__(self):
  32. try:
  33. conhash_lib_path = find_library('conhash')
  34. if not conhash_lib_path:
  35. print 'cannot find libconhash.so'
  36. return
  37.  
  38. self.__conhash_lib_path = conhash_lib_path
  39. self.__conhash_lib = cdll.LoadLibrary(self.__conhash_lib_path)
  40.  
  41. self.__conhash_lib.conhash_init.restype = POINTER(_ConHash_S)
  42. self.__conhash_lib.conhash_lookup.restype = POINTER(_Node_S)
  43.  
  44. self.conhash_init = self.__conhash_lib.conhash_init
  45. self.conhash_fini = self.__conhash_lib.conhash_fini
  46. self.conhash_set_node = self.__conhash_lib.conhash_set_node
  47. self.conhash_add_node = self.__conhash_lib.conhash_add_node
  48. self.conhash_del_node = self.__conhash_lib.conhash_del_node
  49. #self.conhash_update_node = self.__conhash_lib.conhash_update_node
  50. self.conhash_lookup = self.__conhash_lib.conhash_lookup
  51. self.conhash_md5_digest = self.__conhash_lib.conhash_md5_digest
  52. self.conhash_get_vnodes_num = self.__conhash_lib.conhash_get_vnodes_num
  53. self.conhash_get_vnodes = self.__conhash_lib.conhash_get_vnodes
  54. except Exception, ex:
  55. print ex
  56.  
  57. '''try:
  58. conhash_lib_path = find_library('conhash')
  59. ConHash = cdll.LoadLibrary(conhash_lib_path)
  60. ConHash.conhash_init.restype = POINTER(_ConHash_S)
  61. ConHash.conhash_lookup.restype = POINTER(_Node_S)
  62. except Exception, ex:
  63. print ex
  64. '''
  65.  
  66. node1 = _Node_S()
  67. node2 = _Node_S()
  68. node3 = _Node_S()
  69. node4 = _Node_S()
  70. node5 = _Node_S()
  71. node6 = _Node_S()
  72. node7 = _Node_S()
  73. node8 = _Node_S()
  74. node9 = _Node_S()
  75. node10 = _Node_S()
  76.  
  77. #ConHash.conhash_init.restype = POINTER(_ConHash_S)
  78. conhash_inst = ConHash()
  79. conhash = conhash_inst.conhash_init(None)
  80. conhash_inst.conhash_set_node(byref(node2), "192.168.79.101:6380\0", 100)
  81. conhash_inst.conhash_set_node(byref(node3), "192.168.79.101:6381\0", 100)
  82. conhash_inst.conhash_set_node(byref(node4), "192.168.79.101:6382\0", 100)
  83. conhash_inst.conhash_set_node(byref(node5), "192.168.79.101:6383\0", 100)
  84. conhash_inst.conhash_set_node(byref(node1), "192.168.79.101:6384\0", 100)
  85. conhash_inst.conhash_set_node(byref(node6), "192.168.79.101:6385\0", 100)
  86. conhash_inst.conhash_set_node(byref(node7), "192.168.79.101:6386\0", 100)
  87. conhash_inst.conhash_set_node(byref(node8), "192.168.79.101:6387\0", 100)
  88. conhash_inst.conhash_set_node(byref(node9), "192.168.79.101:6388\0", 100)
  89. conhash_inst.conhash_set_node(byref(node10), "192.168.79.101:6389\0", 100)
  90. conhash_inst.conhash_add_node(conhash, byref(node1))
  91. conhash_inst.conhash_add_node(conhash, byref(node2))
  92. conhash_inst.conhash_add_node(conhash, byref(node3))
  93. conhash_inst.conhash_add_node(conhash, byref(node4))
  94. conhash_inst.conhash_add_node(conhash, byref(node5))
  95. conhash_inst.conhash_add_node(conhash, byref(node6))
  96. conhash_inst.conhash_add_node(conhash, byref(node7))
  97. conhash_inst.conhash_add_node(conhash, byref(node8))
  98. conhash_inst.conhash_add_node(conhash, byref(node9))
  99. conhash_inst.conhash_add_node(conhash, byref(node10))
  100.  
  101. while True:
  102. print 'input key:',
  103. key = raw_input()
  104. node11 = conhash_inst.conhash_lookup(conhash, key)
  105. print (key, node11.contents.iden)

参考:

http://www.codeproject.com/Articles/56138/Consistent-hashing

http://docs.python.org/2/library/ctypes.html

https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDQQFjAA&url=https%3a%2f%2fpypi%2epython%2eorg%2fpypi%2fhash_ring%2f&ei=tyrgUfeTJY3AkQWRrIGIAw&usg=AFQjCNETI2uzy4Nhiup7I_y6zKrGXfANaQ&bvm=bv.48705608,d.dGI&cad=rjt

python -- 一致性Hash的更多相关文章

  1. tornado--SESSION框架,一致性hash,分布式存储

    预备知识 tornado框架session要自己写 cookie存储在客户端浏览器上,session数据放在服务器上 session依赖cookie 扩展tornado,返回请求前自定义session ...

  2. [py]一致性hash原理

    1,可变,不可变 python中值得是引用地址是否变化. 2.可hash 生命周期里不可变得值都可hash 3.python中内置数据结构特点 有序不可变 有序可变 无序可变 无序不可变 5.一致性h ...

  3. 01--是时候让我们谈谈一致性hash了

    --------------------- 假如你有图中三个盒子,我们有代号为 1,4,5,12 这四样东西 那根据代号作为主键,将东西放到盒子了,该如何放置? 我们可以对代号取模 1 mod 3 = ...

  4. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  5. 转载自lanceyan: 一致性hash和solr千万级数据分布式搜索引擎中的应用

    一致性hash和solr千万级数据分布式搜索引擎中的应用 互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库.在这样严峻的条件下,一批又一批的创业者从创业中获得 ...

  6. 一致性hash算法详解

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  7. 探索c#之一致性Hash详解

    阅读目录: 使用场景 算法原理 虚拟节点 代码示例 使用场景 以Redis为例,当系统需要缓存的内容超过单机内存大小时,例如要缓存100G数据,单机内存仅有16G时.这时候就需要考虑进行缓存数据分片, ...

  8. 一致性hash算法简介

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...

  9. 分布式缓存技术memcached学习(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...

随机推荐

  1. PyDev for Eclipse 简介

    PyDev 安装和配置 安装 PyDev 在安装 PyDev 之前,要保证您已经安装了 Java 1.4 或更高版本.Eclipse 以及 Python.接下来,开始安装 PyDev 插件. 启动 E ...

  2. 【Insertion Sorted List】cpp

    题目: Sort a linked list using insertion sort. 代码: /** * Definition for singly-linked list. * struct L ...

  3. 如何用myeclispe远程调试tomcat

    如何用myeclispe远程调试tomcat 在工作开发中,通常用本机进行代码编写,然后将编好的工程部署到测试服务器进行测试.往往测试服务器并不是自己的本机,因此对调试带来众多不便.今天学习可以用my ...

  4. UML序列图总结

    转载请注明出处:htt://blog.csdn.net/tianhai110 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在 ...

  5. 【BZOJ】【2424】【HAOI2010】订货

    网络流/费用流 比较简单的题……我一开始想成像软件开发那题一样的做法了……就是每天拆点,S->i (INF,0) .i+n->T (u[i],0) 然后处理购入 S->i+n (IN ...

  6. 异步解压ZIP文件

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  7. openSSL漏洞原理及安全加固

    2014年4月8日晚,互联网爆出了又一重量级安全漏洞,即CVE-2014-0160,通俗来讲就是OpenSSL出现了安全漏洞. 说 这个漏洞前,先介绍一下OpenSSL,OpenSSL是一个强大的安全 ...

  8. LCA 笔记

    简述这几天的LCA 心得: LCA有两种做法:离线 or 在线 先学的离线: 原理博客很多. 我写得两道题,已经模板. HDU:http://acm.hdu.edu.cn/showproblem.ph ...

  9. 在线运行HTML代码器

    在线运行HTML代码器(二)和前面的(一)大同小异,关键部分为JS代码,这次是把运行器所有的JS功能集中放在一起.以下为HTML代码: <!DOCTYPE html PUBLIC "- ...

  10. 10个jQuery插件分享

    原文:http://www.shejidaren.com/10-jquery-plugins.html blur.js blur.js是一个很有意思的插件,它能实现像WIN7 AERO效果的JS插件, ...