线程池hash算法

本文探讨了两种哈希算法,rotatehash和addhash,着重介绍了加法Hash在分配WebSocket请求到线程池中的优势。通过实例展示了如何使用addhash算法并观察其在不同URL上的效果,以及与记录URL分配方式的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
也可以做到,用空间来代替选择,可以做到直接的平均分配,也是可以的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值