hash算法选择
1 rotatehash 算法
2 add hash算法
3 选择hash
结果
1 rotatehash 算法
static int hash_rotate(const char key, int prime)
{
int hash, i;
int len = strlen(key);
for (hash = len, i = 0; i < len; i++)
{
hash = (hash<<4>>28)^key[i];
return (hash % prime);
}
}
2 add hash算法
//加法hash,需要平均分配到各个线程中
static int hash_add(const char key, int prime)
{
int hash, i;
int len = strlen(key);
for (hash = len, i = 0; i < len; i++)
hash += key[i];
return (hash % prime);
}
3 选择hash
int _tmain(int argc, _TCHAR* argv[])
{
const char * url = “xn/live/234”;
const char * url2 = “xn1/live/2345”;
const char * url3 = “xn2/live/234”;
const char * url4 = “xn/abc/23411”;
const char * url5 = “xn/abcd/234”;
const char * url6 = “xn/abcd/2345”;
const char * url7 = “xn/abcd/2346”;
const char * url8 = “xn/abcd/2347”;
const char * url9 = “xn/abcd/2348”;
const char * url10 = “xn/abcd/2349”;
const char * url11 = “xn2/abcd/2349”;
cout << hash2(url, 7) <<endl;
cout << hash2(url2, 7)<<endl;
cout << hash2(url3, 7)<<endl;
cout << hash2(url4, 7)<<endl;
cout << hash2(url5, 7)<<endl;
cout << hash2(url6, 7)<<endl;
cout << hash2(url7, 7) << endl;
cout << hash2(url8, 7) << endl;
cout << hash2(url9, 7) << endl;
cout << hash2(url10, 7) << endl;
cout << hash2(url11, 7) << endl;
}
加法hash 结果输出:比较平均分配到素数里面,我们用素数个线程启动任务,把不同的url任务分配到不同的工作者线程中
加法hash效果比较好,计算简单,当然你可以做更多的测试。
结果
websocket请求中,我们把不同的路由分配线程池中,简单计算到不同的线程里面,而不用记录哪个url路由在哪个线程中
如果记录,如下:
map<string,int> _recordurl;
也可以做到,用空间来代替选择,可以做到直接的平均分配,也是可以的。