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