我需要一个3D矢量的哈希函数,在关键值之间不会发生冲突。
关键是整数的3d矢量。我希望在大约64 * 64 * 64"区域内不会发生碰撞。或更大。
有没有人知道任何适用于此目的的散列函数,甚至更好,你会如何为此设计散列?
如果有必要知道,我将用C ++实现它。
答案 0 :(得分:2)
为什么不为对象创建Map<int,Map<int,Map<int,Object>>>
?每个int
都是x,y,z或您为轴标记的任何内容。
以下是您如何使用它的示例。
int x,y,z;
map<int,map<int,map<int,string>>> Vectors = map<int,map<int,map<int,string>>>();
/*give x, y and z a real value*/
Vectors[x][y][z] = "value";
/*more code*/
string ValueAtXYZ = Vectors[x][y][z];
只是解释因为它不是非常明显。
Vectors[x]
会返回map<int,map<int,string>>
。
然后我立即将地图[]
运算符与[y]
一起使用。
然后返回(你猜对了)map<int,string>
。
我立即将地图[]
运算符与[z]
一起使用,现在可以设置字符串。
注意:请确保使用迭代而不是for(int x = 0; /*bad code*/;x++)
循环遍历它,因为[]
在以前用于查找的每个位置都添加了一个元素起来。 Here's循环和Here's的示例以及意外添加的示例。
修改强>
如果您想确保不会覆盖现有值,可以执行此操作。
string saveOldValue;
if(Vectors[x][y][z] != ""/*this is the default value of a string*/)
{
/*There was a string in that vector so store the old Value*/
saveOldValue = Vectors[x][y][z];
}
Vectors[x][y][z] = "Value";
如果您对地图中没有的关键字使用[]
,地图会在那里创建默认对象。对于字符串,这将是空字符串""
。
或强>
if( Vectors.find(x)!=Vectors.end()
&& Vectors[x].find(y)!=Vectors[x].end()
&& Vectors[x][y].find(z)!=Vectors[x][y].end())
{
/* Vectors[x][y][z] has something in it*/
}else
{
/*Theres nothing at Vectors[x][y][z] so go for it*/
Vectors[x][y][z] ="value";
}
这使用find(value)
函数将迭代器返回到键的位置&#34; value&#34;如果该键不在当前地图中,则 OR 和指向map::end()
的迭代器。
如果您没有存储物品的默认值,请使用第二项检查进行插入。这大大提高了这个答案的可用性,并使代码整洁。
insert
功能有它的位置,但在这个例子中,它很难使用。