在c ++中散列3D整数坐标的最快方法

时间:2015-02-17 13:21:10

标签: c++ hash

我有一个游戏世界分为几个部分,每个部分都被称为3个整数坐标。世界上有一个起源位于0,0,0,坐标可能是负的。

我使用带有为这些3D整数坐标实现的散列函数的unordered_maps来访问这些部分。

现在我想知道,在任何给定时间,只有一小部分附近区域可能会产生较少量碰撞的最快方式。

现在我使用这个哈希函数:

size_t x = coord.x;
x = (x | (x << 32)) & 0xFFFF00000000FFFF;
x = (x | (x << 16)) & 0x00FF0000FF0000FF;
x = (x | (x << 8))  & 0xF00F00F00F00F00F;
x = (x | (x << 4))  & 0x30C30C30C30C30C3;
x = (x | (x << 2))  & 0x9249249249249249;

size_t y = coord.y;
y = (y | (y << 32)) & 0xFFFF00000000FFFF;
y = (y | (y << 16)) & 0x00FF0000FF0000FF;
y = (y | (y << 8))  & 0xF00F00F00F00F00F;
y = (y | (y << 4))  & 0x30C30C30C30C30C3;
y = (y | (y << 2))  & 0x9249249249249249;

size_t z = coord.z;
z = (z | (z << 32)) & 0xFFFF00000000FFFF;
z = (z | (z << 16)) & 0x00FF0000FF0000FF;
z = (z | (z << 8))  & 0xF00F00F00F00F00F;
z = (z | (z << 4))  & 0x30C30C30C30C30C3;
z = (z | (z << 2))  & 0x9249249249249249;
return x | (y << 1) | (z << 2); 

这是一个简单的比特交错/ z顺序功能。在避免附近的冲突方面非常好,但由于这个哈希函数在我的代码库中仍然被调用很多次(它占执行时间的5%),因此可能会有所改进。

有没有比这更快,更好的方法?

0 个答案:

没有答案