3D 哈希,关闭值没有冲突
3D Hash with no collisions on close values
我需要 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
函数有它的位置,但在这个例子中很难使用。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 无冲突的哈希函数
- 使用 Murmur2 64 位哈希函数生成会导致冲突的输入
- C++ 提升哈希计算而不会发生冲突
- C++ 如何在使用哈希函数时计算冲突次数
- 编译哈希算法时出现内存访问冲突错误
- 0xC0000005:访问冲突读取位置0x00000000哈希函数
- 减少的SHA1哈希的部分冲突
- 正在哈希表中查找最长的冲突(链)
- 哈希表中的冲突处理
- 用C++实现哈希表冲突的避免与解决
- 在c++中向哈希表中添加项会产生访问冲突异常
- 在c++中使用unordered_map实现哈希表并处理冲突
- c++哈希表和链表的访问冲突
- 哈希表冲突,如何获得正确的值
- 3D 哈希,关闭值没有冲突
- 哈希表实现,集合的零冲突?发人深思的东西
- 对ASCII字符的哈希冲突进行测试