一致性 hash 算法( consistent hashing )

1. 代码组织

2. conhash.h

/*************************************************************************
    > File Name: conhash.h
    > Author: ma6174
    > Mail: [email protected]
    > Created Time: Mon 03 Nov 2014 08:51:23 PM WST
 ************************************************************************/
#ifndef CONHASH_H
#define CONHASH_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <map>
#include <string>
#include <sstream>
using namespace std;
/*
 * Cache class For store object
 * */
class Cache {
	private:
		string identity;
		uint vcnt;         // the count of virtual cache
	public:
		Cache();
		Cache(string, uint);
		string getIdentity();
		uint getVcnt();
};
struct cmp {
	bool operator()(uint hash1, uint hash2) const {
		return hash1 - hash2 <= 0;
	}
};
class ConHash {
	private:
	//	map<uint, Cache*, cmp>CacheMap;
		map<uint, Cache*>CacheMap;
	public:
		ConHash() {
		}
		uint hashFunc(string);
		void addCache(Cache *cache);
		Cache * search(string object);
};
#endif

3. conhash.cpp

/*************************************************************************
    > File Name: conhash.cpp
    > Author: ma6174
    > Mail: [email protected]
    > Created Time: Mon 03 Nov 2014 08:58:11 PM WST
 ************************************************************************/

#include "conhash.h"
Cache::Cache() {
	identity = "";
	vcnt = 0;
}
Cache::Cache(string _identity, uint _vcnt):identity(_identity), vcnt(_vcnt) {
}
string Cache::getIdentity() {
	return this->identity;
}
uint Cache::getVcnt() {
	return this->vcnt;
}
uint ConHash::hashFunc(string str) {
    uint seed = 131; // 31 131 1313 13131 131313 etc..
    uint hash = 0;
	string::iterator index = str.begin();
    while (index < str.end())
    {
        hash = hash * seed + (*index++);
    }

    return (hash & 0x7FFFFFFF);
}
void ConHash::addCache(Cache *cache) {
	ostringstream oss;
	string identity = cache->getIdentity();
	uint vcnt = cache->getVcnt();
	uint key;
	string value;
	int i;
	for(i = 0;i < vcnt;i++) {
		oss << identity << i;
		value = oss.str();
		key = this->hashFunc(value);
		this->CacheMap.insert(pair<uint, Cache*>(key, cache));
	}

}
Cache *ConHash::search(string object) {
	uint hash = this->hashFunc(object);
	map<uint, Cache*>::iterator it;
	it = CacheMap.begin();
	while(it != CacheMap.end()) {
		if(it->first >= hash) {
			return it->second;
		}
		it++;
	}
	return NULL;
}

4.  main.cpp

/*************************************************************************
    > File Name: main.cpp
    > Author: ma6174
    > Mail: [email protected]
    > Created Time: Mon 03 Nov 2014 09:12:53 PM WST
 ************************************************************************/

#include "conhash.h"
int main() {
	Cache *cache1 = new Cache("Machine A", 20);
	Cache *cache2 = new Cache("Machine B", 30);
	Cache *cache3 = new Cache("Machine C", 10);
	Cache *cache4 = new Cache("Machine D", 40);
	string request;
	ConHash conhash;
	conhash.addCache(cache1);
	conhash.addCache(cache2);
	conhash.addCache(cache3);
	conhash.addCache(cache4);
	cout<<cache1<<" "<<cache2<<" "<<cache3<<" "<<cache4<<endl;
	while(1) {
		cout << "Request from...";
		cin>>request;
		cout<<conhash.search(request)->getIdentity()<<endl;
	}

	return 0;
}

5.  Makefile

CC=g++
all:
	$(CC) -g -o main main.cpp conhash.cpp

6. 测试

时间: 2024-12-28 01:43:33

一致性 hash 算法( consistent hashing )的相关文章

一致性hash算法 – consistent hashing

consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在cache 系统中应用越来越广泛: 1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache :澳门威尼斯人赌场 hash(object)%N

一致性hash算法 - consistent hashing

1.背景 我们都知道memcached服务器是不提供分布式功能的,memcached的分布式完全是由客户端来实现的.在部署memcached服务器集群时,我们需要把缓存请求尽可能分散到不同的缓存服务器中,这样可以使得所有的缓存空间都得到利用,而且可以降低单独一台缓存服务器的压力.     最简单的一种实现是,缓存请求时通过计算key的哈希值,取模后映射到不同的memcahed服务器.这种简单的实现在不考虑集群机器动态变化的情况下也是比较有效的一种方案,但是,在分布式集群系统中,简单取模的哈希算法

一致性Hash算法(分布式算法)

一致性哈希算法是分布式系统中常用的算法,为什么要用这个算法? 比如:一个分布式存储系统,要将数据存储到具体的节点(服务器)上, 在服务器数量不发生改变的情况下,如果采用普通的hash再对服务器总数量取模的方法(如key%服务器总数量),如果期间有服务器宕机了或者需要增加服务器,问题就出来了. 同一个key经过hash之后,再与服务器总数量取模的结果跟之前的结果会不一样,这就导致了之前保存数据的丢失.因此,引入了一致性Hash(Consistent Hashing)分布算法 把数据用hash函数(

一致性 hash 算法( consistent hashing )a

一致性 hash 算法( consistent hashing ) 张亮 consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在cache 系统中应用越来越广泛: 1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到

hash环/consistent hashing一致性哈希算法

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用.很多哈希算法都能够满

一致性哈希算法(consistent hashing)(转)

原文链接:每天进步一点点——五分钟理解一致性哈希算法(consistent hashing) 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的

Go语言实现一致性哈希(Consistent Hashing)算法

一致性哈希可用于解决服务器均衡问题. 用Golang简单实现了下,并加入了权重.可采用合适的权重配合算法使用. package main //一致性哈希(Consistent Hashing) //author: Xiong Chuan Liang //date: 2015-2-20 import ( "fmt" "hash/crc32" "sort" "strconv" "sync" ) const DE

一致性哈希算法(consistent hashing)

memcache的一致性hash算法使用 http://blog.csdn.net/kongqz/article/details/6695417 一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的key进行hash计算,分配到不同节点存储.一致性hash算法是对我们要存储数据的服务器进行hash计算,进而确认每个key的存储位置.  2.常规hash

_00013 一致性哈希算法 Consistent Hashing 探讨以及相应的新问题出现解决

一.业务场景 假如我们现在有12台Redis服务器(其它的什么东西也行),有很多User(用户)的数据数据从前端过来,然后往12台redis服务器上存储,在存储中就会出现一个问题,12台服务器,有可能其中几台Redis服务器上(简称集群A)存了很多的数据,然后另外几台Redis服务器(简称集群B)上存的数据很少,这样的话那 A 上的读写压力就会很大(当然,这个要看你的数据量的大小了,如果你数据量很小的话,基本无压力了,但是数据量很大,那就 ...),对于这样的问题,我们通常的解决办法是什么呢 ?

_00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作. qq交流群:214293307  idkey=bf80524ac3630cb09