散列不同大小的整数坐标

时间:2015-06-07 21:39:53

标签: hash voxel

我正在尝试将一些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位字吗?

2 个答案:

答案 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位哈希消耗更多的内存。

我会将此标记为已回答,但如果有人能够启发我,原始问题仍然存在。