3D哈希,关闭值没有碰撞

时间:2014-04-08 23:35:24

标签: c++ vector hash 3d collision

我需要一个3D矢量的哈希函数,在关键值之间不会发生冲突。

关键是整数的3d矢量。我希望在大约64 * 64 * 64"区域内不会发生碰撞。或更大。

有没有人知道任何适用于此目的的散列函数,甚至更好,你会如何为此设计散列?

如果有必要知道,我将用C ++实现它。

1 个答案:

答案 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功能有它的位置,但在这个例子中,它很难使用。