ali*_*ali 7 math voxel geohashing
具有3D均匀网格,为了节省大型模型中的存储器,不需要保存空单元(不与任何对象重叠的单元).为了这个目的,我在c#中使用Dictionary.尽管性能已经降低,但这仍然比创建3D网格时出现异常更好.现在我的问题是找到一个快速哈希函数,将网格的3d整数坐标映射到唯一的数字.
我已经尝试过((x*73856093 + y*19349669 + z*83492791))%n,它并不总是生成一个唯一的数字.
一方面,您将目标写为“保存内存”,另一方面,您要求“一种将网格的3d整数坐标映射到唯一数字的快速哈希函数”。这两个不是很兼容。
您要么要保证 O(1)访问。在这种情况下,必须防止哈希冲突,并且必须将输入映射到唯一的数字。但是在那种情况下,您还需要在哈希映射中包含尽可能多的输入单元。因此,您将无法通过简单的N×N×N阵列节省任何内存。
或者-而且这很有可能-您只希望哈希冲突很少见。然后,您可以拥有一个哈希图,该哈希图大约是实际存储的对象数量的两倍。但是在这种情况下,您不必完全避免哈希冲突,只需使它们足够少。
选择一个好的哈希函数在很大程度上取决于输入数据的可能模式。如果输入是相当随机的,并且知道哈希图的大小,则应以均匀分布为目标。如果对象很可能位于相邻的块中,那么您要确保坐标的微小变化不太可能导致碰撞。在这一点上,它有助于避免使您的因素充斥,因此一个方向上的微小变化不太可能被另一个方向上的一个碰撞。
如有疑问,您可以随时测试:给定三个质数(例如137x + 149y + 163z哈希)和一些实际设置(即使用的坐标和生成的哈希图大小),您可以将哈希简单地应用于所有坐标,修改为哈希图大小并计算唯一值的数量。对不同的三元组执行相同的操作,然后选择一个使该数量最大的三元组。但是我怀疑优化水平是否值得付出努力。