散列由IEEE 32位浮點組成的2d和3d矢量的散列函數(快速,分佈好,碰撞少)是什麼?我假定一般的3d矢量,但是假設法線的算法(總是在[-1,1]中)也是受歡迎的。我也不害怕位操縱,因爲IEEE浮動也是IEEE浮動的。散列2D,3D和nD矢量
另一個更普遍的問題是哈希一個Nd浮點向量,其中N非常小(3-12)並且是恆定的,但在編譯時不知道。目前,我只是將這些花車作爲提示並將它們異或,這可能不是最好的解決方案。
散列由IEEE 32位浮點組成的2d和3d矢量的散列函數(快速,分佈好,碰撞少)是什麼?我假定一般的3d矢量,但是假設法線的算法(總是在[-1,1]中)也是受歡迎的。我也不害怕位操縱,因爲IEEE浮動也是IEEE浮動的。散列2D,3D和nD矢量
另一個更普遍的問題是哈希一個Nd浮點向量,其中N非常小(3-12)並且是恆定的,但在編譯時不知道。目前,我只是將這些花車作爲提示並將它們異或,這可能不是最好的解決方案。
存在Optimized Spatial Hashing for Collision Detection of Deformable Objects中描述的空間散列函數。他們使用的哈希函數
哈希(X,Y,Z)=(x p1的XORŸP2 XORž P3)模N
其中P1,P2,P3大 素數,在我們的案例分別爲73856093, 19349663,83492791。 值n是哈希表大小。
在論文中,x,y和z是離散化座標;你大概也可以使用你的浮點數的二進制值。
我有兩個建議。
如果你不做量化,它不會對接近度(局部性)敏感。
...您是否測試過使用純XOR方法分配散列的程度?你可能會感到驚訝。 – 2011-05-08 16:33:27
@Matti似乎至少對於3D矢量的分佈並不是非常糟糕(在斯坦福大學兔子35k verts上對65537大小的哈希表進行測試)。我只是覺得有人可能有一個更專業的解決方案,因爲我前一段時間搜索了網絡,並沒有發現任何關於該主題的內容。 – 2011-05-08 17:31:48
65537聽起來像一個比你可能想要使用的數字更大(或是一個錯字) – 2013-09-13 03:12:36