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

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

 Basic example of usage (for managing memcached instances):

 memcache_servers = ['192.168.0.246:11212',
'192.168.0.247:11212',
'192.168.0.249:11212'] ring = HashRing(memcache_servers)
server = ring.get_node('my_key')
Example using weights: memcache_servers = ['192.168.0.246:11212',
'192.168.0.247:11212',
'192.168.0.249:11212']
weights = {
'192.168.0.246:11212': 1,
'192.168.0.247:11212': 2,
'192.168.0.249:11212': 1
} ring = HashRing(memcache_servers, weights)
server = ring.get_node('my_key')

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

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

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

 from ctypes import *
import os
from ctypes.util import find_library class _Util_Rbtree_Node_S(Structure):
pass _Util_Rbtree_Node_S._fields_ = [('key',c_long),
('parent',POINTER(_Util_Rbtree_Node_S)),
('right',POINTER(_Util_Rbtree_Node_S)),
('left',POINTER(_Util_Rbtree_Node_S)),
('color',c_int),
('data',c_void_p)] class _Util_Rbtree_S(Structure):
_fields_ = [('root',POINTER(_Util_Rbtree_Node_S)),
('null',_Util_Rbtree_Node_S),
('size',c_uint)] class _ConHash_S(Structure):
_fields_ = [('vnode_tree',_Util_Rbtree_S),
('ivnodes',c_uint),
('cb_hashfunc',CFUNCTYPE(c_long,c_char_p))] class _Node_S(Structure):
_fields_ = [('iden',c_char * 64),
('replicas',c_uint),
('flag',c_uint),] class ConHash:
def __init__(self):
try:
conhash_lib_path = find_library('conhash')
if not conhash_lib_path:
print 'cannot find libconhash.so'
return self.__conhash_lib_path = conhash_lib_path
self.__conhash_lib = cdll.LoadLibrary(self.__conhash_lib_path) self.__conhash_lib.conhash_init.restype = POINTER(_ConHash_S)
self.__conhash_lib.conhash_lookup.restype = POINTER(_Node_S) self.conhash_init = self.__conhash_lib.conhash_init
self.conhash_fini = self.__conhash_lib.conhash_fini
self.conhash_set_node = self.__conhash_lib.conhash_set_node
self.conhash_add_node = self.__conhash_lib.conhash_add_node
self.conhash_del_node = self.__conhash_lib.conhash_del_node
#self.conhash_update_node = self.__conhash_lib.conhash_update_node
self.conhash_lookup = self.__conhash_lib.conhash_lookup
self.conhash_md5_digest = self.__conhash_lib.conhash_md5_digest
self.conhash_get_vnodes_num = self.__conhash_lib.conhash_get_vnodes_num
self.conhash_get_vnodes = self.__conhash_lib.conhash_get_vnodes
except Exception, ex:
print ex '''try:
conhash_lib_path = find_library('conhash')
ConHash = cdll.LoadLibrary(conhash_lib_path)
ConHash.conhash_init.restype = POINTER(_ConHash_S)
ConHash.conhash_lookup.restype = POINTER(_Node_S)
except Exception, ex:
print ex
''' node1 = _Node_S()
node2 = _Node_S()
node3 = _Node_S()
node4 = _Node_S()
node5 = _Node_S()
node6 = _Node_S()
node7 = _Node_S()
node8 = _Node_S()
node9 = _Node_S()
node10 = _Node_S() #ConHash.conhash_init.restype = POINTER(_ConHash_S)
conhash_inst = ConHash()
conhash = conhash_inst.conhash_init(None)
conhash_inst.conhash_set_node(byref(node2), "192.168.79.101:6380\0", 100)
conhash_inst.conhash_set_node(byref(node3), "192.168.79.101:6381\0", 100)
conhash_inst.conhash_set_node(byref(node4), "192.168.79.101:6382\0", 100)
conhash_inst.conhash_set_node(byref(node5), "192.168.79.101:6383\0", 100)
conhash_inst.conhash_set_node(byref(node1), "192.168.79.101:6384\0", 100)
conhash_inst.conhash_set_node(byref(node6), "192.168.79.101:6385\0", 100)
conhash_inst.conhash_set_node(byref(node7), "192.168.79.101:6386\0", 100)
conhash_inst.conhash_set_node(byref(node8), "192.168.79.101:6387\0", 100)
conhash_inst.conhash_set_node(byref(node9), "192.168.79.101:6388\0", 100)
conhash_inst.conhash_set_node(byref(node10), "192.168.79.101:6389\0", 100)
conhash_inst.conhash_add_node(conhash, byref(node1))
conhash_inst.conhash_add_node(conhash, byref(node2))
conhash_inst.conhash_add_node(conhash, byref(node3))
conhash_inst.conhash_add_node(conhash, byref(node4))
conhash_inst.conhash_add_node(conhash, byref(node5))
conhash_inst.conhash_add_node(conhash, byref(node6))
conhash_inst.conhash_add_node(conhash, byref(node7))
conhash_inst.conhash_add_node(conhash, byref(node8))
conhash_inst.conhash_add_node(conhash, byref(node9))
conhash_inst.conhash_add_node(conhash, byref(node10)) while True:
print 'input key:',
key = raw_input()
node11 = conhash_inst.conhash_lookup(conhash, key)
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. Windows准备Node.js运行与开发环境

    如何在Windows环境下搭建Node.js开发环境:1.下载Node.js windows安装版http://www.nodejs.org/download/ 2.正常安装完成后,在系统环境变量已经 ...

  2. 1564: [NOI2009]二叉查找树 - BZOJ

    Description Input Output只有一个数字,即你所能得到的整棵树的访问代价与额外修改代价之和的最小值.Sample Input4 101 2 3 41 2 3 41 2 3 4Sam ...

  3. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  4. IDA*

    模拟退火 基本思路(Main Thoughts): IDA*是一种优秀的搜索法,在一般的实际问题中,它比普通的搜索更快. 通过迭代加深和估价函数剪枝来搜索. 通常处理没有层数上界或上界很多大的搜索. ...

  5. Java 函数参数传递方式详解 分类: Java Game 2014-08-15 06:34 82人阅读 评论(0) 收藏

    转:http://zzproc.iteye.com/blog/1328591 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式:  A. 是按值传递的?  B. ...

  6. JavaScript之常用方法讲解

    1.indexOf() 定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,frominde ...

  7. HDOJ 1466 计算直线的交点数

    将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,......,直线n 和其他n-1条直线最多有n-1个交点.由此得出n条直线互不平行且无三线共点的最多交点数 ...

  8. php随机数怎么获取?一个简单的函数就能生成

    小美女建了一个站,有些页面相似度比较高,想添加一些字段来实现差异化,比如用php随机数生成从10到100之间随机一个数字.其实会php的朋友几十个字符就能实现了,如下代码所示,简单吧?10代表最小值, ...

  9. linux gcc++漏洞:普通用户获得root权限

    linux gcc++漏洞:普通用户获得root权限 2012-02-06 10:22:38|  分类: linux安全|举报|字号 订阅       经我测试在RHEL5 / CentOS5 / F ...

  10. 充分发挥异步在 ASP.NET 中的强大优势

    作者:Brij Bhushan Mishra 最近几年,异步编程受到极大关注,主要是出于两个关键原因:首先,它有助于提供更好的用户体验,因为不会阻塞 UI 线程,避免了处理结束前出现 UI 界面挂起. ...