【发布时间】:2015-06-08 06:51:56
【问题描述】:
我正在尝试将一些 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 位字?
【问题讨论】: