我有一个游戏世界分为几个部分,每个部分都被称为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%),因此可能会有所改进。
有没有比这更快,更好的方法?