我正在尝试将一些3D坐标哈希到一个16位整数。 坐标具有以下约束:
x [0, 16]
y [0,256]
z [0, 16]
是否可以获得O(1)访问,零冲突,并且仍然适合16位字?
我的想法是移动坐标使得x占据前4位,y占用接下来的8位,z占据最后4位。经过一些迭代后,我想出了以下内容,它们会移动并屏蔽这些位,使得它们不应该t重叠并导致碰撞:
unsigned int hash(unsigned char x, unsigned char y, unsigned char z) {
return (x << 12) & 0xF000 |
(y << 8) & 0x0FF0 |
z & 0x000F;
}
然而,这确实会以某种方式产生碰撞!我不确定为什么,如果有人能告诉我,我会很感激。
在研究哈希时,我发现z阶曲线/莫顿编码是一个很好的方法,但假设每个维度的坐标范围是不变的。一个选项可以将morton编码为x和z为8位,并以某种方式将其与y坐标组合成16位字吗?
答案 0 :(得分:0)
可能是因为你写了
x & 0x000F
什么时候应该
z & 0x000F
第二班次也是错误的,所以试试:
unsigned int hash(unsigned char x, unsigned char y, unsigned char z) {
return (x << 12) & 0xF000 |
(y << 4) & 0x0FF0 |
z & 0x000F;
}
答案 1 :(得分:0)
我尝试使用以下代码映射到32位整数。
master()
我的单元测试通过了它似乎工作但我担心这可能会比16位哈希消耗更多的内存。
我会将此标记为已回答,但如果有人能够启发我,原始问题仍然存在。