【发布时间】:2012-05-23 05:51:40
【问题描述】:
我有 16 个线程来计算密钥的哈希值。我试图在线程之间分配工作,因为计算哈希并检查它是否以线性方式存在只使用了我 cpu 功率的一小部分。目前,我正在使用一个所有线程都可以使用互斥锁访问的地图容器。然而,由于实际的散列几乎不需要任何时间,线程大多处于空闲状态,等待另一个线程完成其业务,使用 map::count 检查键是否存在于映射中。
这个程序的主要目标是蛮力检查碰撞,因为在我将它添加到我的项目之前,我需要确保没有碰撞。
有没有办法使用单独的映射或其他容器来确定所述键是否存在,而不是在所有线程完成后使用每个键线性搜索每个映射?某种排队系统呢?
编辑:这是我试图线程化的函数:
int coll = 0;
map<long, bool> mymap;
string temp;
long myhash;
for (int i = 0; i < 256; i++)
for (int j = 0; j < 256; j++)
for (int k = 0; k < 256; k++)
{
temp = i;
temp += j;
temp += k;
temp += temp;
myhash = hash(temp.c_str());
if (mymap.count(myhash))
{
coll++;
cout << "Collision at " << i << " " << j << " " << k << endl;
}
else
{
mymap[myhash] = true;
}
}
cout << "Number of collisions: " << coll << endl;
cout << "Map size: " << mymap.size() << endl;
【问题讨论】:
-
听起来像是某种“每桶”锁定……但这有意义吗?如果你只想改变元素,而不是容器,你可以让每个元素自己锁定。
-
这个容器有多大?您可以将映射拆分为多个映射(或哈希映射)并使用哈希函数告诉您要在哪个映射上进行查找,这类似于映射/缩减方法,但只有在容器大小足够大时才实用这是值得的,所以你需要配置文件
-
@EdChum 目前,我已经能够比较 256^3 个值(约 1600 万)。但我想添加第四把钥匙。这需要大约 45 秒来计算和比较 256^3 个键。将此增加到 256^4,我正在查看大约 2.5 小时的比较。
标签: c++ multithreading hash map pthreads