Hash 散列不同大小的整数坐标

Hash 散列不同大小的整数坐标,hash,voxel,Hash,Voxel,我正在尝试将一些3D坐标散列为16位整数。 坐标具有以下约束: x [0, 16] y [0,256] z [0, 16] 是否有可能获得O(1)访问,零冲突,并仍然适合它在一个16位字 我的想法是移动坐标,使x占据前4位,y占据下8位,z占据最后4位。经过一些迭代后,我提出了以下方法,对位进行移位和屏蔽,使其不会重叠并导致冲突: unsigned int hash(unsigned char x, unsigned char y, unsigned char z) { return (x

我正在尝试将一些3D坐标散列为16位整数。 坐标具有以下约束:

x [0, 16]
y [0,256]
z [0, 16]
是否有可能获得O(1)访问,零冲突,并仍然适合它在一个16位字

我的想法是移动坐标,使x占据前4位,y占据下8位,z占据最后4位。经过一些迭代后,我提出了以下方法,对位进行移位和屏蔽,使其不会重叠并导致冲突:

unsigned int hash(unsigned char x, unsigned char y, unsigned char z) {
  return (x << 12) & 0xF000 |
         (y << 8)  & 0x0FF0 |
          z        & 0x000F;
}
unsigned int散列(unsigned char x、unsigned char y、unsigned char z){

return(x可能是因为你写了

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;
}
unsigned int散列(unsigned char x、unsigned char y、unsigned char z){

return(x我尝试用下面的代码映射到一个32位整数

return ((x) << 24)  & 0xFF000000 |
       ((y) << 16)  & 0x00FFFF00 |
       z            & 0x000000FF;

返回((x)该死!谢谢你发现了这一点,但它仍然会产生冲突。它似乎只会产生4096个可能的哈希,剩下61440个冲突!@perryperry:如果你真的是说这些都是包含的上限,那么就不可能在没有冲突的情况下将它们放入16位。无论如何,请参见编辑–你还需要将它们移位4而不是8.