3D 哈希,关闭值没有冲突

3D Hash with no collisions on close values

本文关键字:冲突 哈希 3D      更新时间:2023-10-16

我需要 3D 向量的哈希函数,关闭键值之间没有冲突。

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

有谁知道任何适合此目的的哈希函数,甚至更好的是,您将如何为此设计哈希?

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

为什么不为您的对象创建一个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++)循环来循环它,因为[]在用于查找的每个位置添加一个元素。下面是一个循环示例,下面是一个意外添加的示例。

编辑:

如果要确保不会覆盖现有值,可以执行此操作。

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) 函数,该函数将迭代器返回到键"值"OR 的位置,如果该键不是当前映射的整数,则迭代器指向map::end()

如果您没有要存储的东西的默认值,请使用第二个检查进行插入。这大大提高了此答案的可用性并整理了您的代码。

insert函数有它的位置,但在这个例子中很难使用。