web-dev-qa-db-ja.com

2D、3D、およびnDベクトルのハッシュ

IEEE 32ビットフロートで構成される2Dおよび3Dベクトルをハッシュするための優れたハッシュ関数(高速、良好な分散、衝突が少ない)とは何ですか。一般的な3Dベクトルを想定していますが、法線(常に[-1,1])を想定したアルゴリズムも歓迎します。 IEEEフロートは常にIEEEフロートであるため、ビット操作も恐れません。

もう1つのより一般的な問題は、Nd floatベクトルのハッシュです。ここで、Nは非常に小さく(3〜12)定数ですが、コンパイル時には不明です。現時点では、これらのフロートをuintとして取り、XOR一緒に使用します。これは、おそらく最善の解決策ではありません。

変形可能なオブジェクトの衝突検出のための最適化された空間ハッシュ で説明されている空間ハッシュ関数があります。彼らはハッシュ関数を使用します

hash(x、y、z)=(x p1 xor y p2 xor z p3)mod n

ここで、p1、p2、p3は大きな素数であり、この場合はそれぞれ73856093、19349663、83492791です。値nはハッシュテーブルのサイズです。

この論文では、x、y、zは離散化された座標です。おそらく、フロートのバイナリ値を使用することもできます。

46
celion

2つの提案があります。

量子化を行わないと、近接性(局所性)に敏感になりません。

  • 局所性鋭敏型ハッシュ 高次元ベクトルのハッシュについて言及されています。 3Dまたは2Dベクトルにも使用してみませんか?ユークリッド距離計量(2dおよび3dベクトルに必要なもの)に適合したLSHの変形は、p-stable分布を使用した局所性鋭敏型ハッシュと呼ばれます。非常に読みやすいチュートリアルは ここ です。
10
koshy george