GISデータのハッシュ関数


8

ベクターデータセットからジオメトリを取得し、ハッシュに縮小したいと思います。次に、このハッシュを使用して、そのデータの整合性を検証し、同一のジオメトリを識別します。

使用できる適切なアルゴリズムはありますか?どのような落とし穴に遭遇する可能性がありますか?


4
ベクトルデータでメッセージを非表示にするという、密接に関連するアプリケーションに関連する問題のほんの一部の概要については、ベクターステガノグラフィに関する私の記事(Directionsマガジン)に興味があるかもしれません。
whuber

ジオメトリが等しいと見なされるためにジオメトリが満たす必要があるものは何ですか?回転が含まれていない場合は、WKBを確認して拡張し、変換されたジオメトリを比較できます。
lynxlynxlynx 2013年

「おそらく機能する最も単純なこと」は、標準のハッシュを使用することです(たとえば、セキュリティプロパティが必要ない場合はCRC32またはMD4、1つ以上のセキュリティプロパティが必要な場合はSHA256)。lynxlynxlynxが指摘したように、ジオメトリは浮動小数点データであるため、「同等」の比較には注意が必要です。
BradHards 2013年

回答:


4

また、同一のジオメトリを識別します。

識別にハッシュコードを使用することはできません。以下の場合、ハッシュ衝突あなたは常に後処理として、より高価な比較方法が必要になりますので、あなたは、異なるオブジェクトに対して同じハッシュコードを得ることができます。しかしもちろん、ハッシュの衝突を減らすために、ハッシュ方式を調整することもできます。

単純にしたい場合は、MD5または任意のハッシュを使用しますが、ハッシュの衝突の確率をさらに減らすことができます。ジオメトリが変換または回転されておらず、整数のハッシュコードが必要な場合、メソッドは次のようになります。

int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
     hash = hash XOR geohash(point.lat, point.lon)
}

以下のためにジオハッシュ方法もに見ていた空間キーエリアの境界が世界の境界よりも小さい場合にはより多くのメモリ効率的で、より正確である(「バイナリジオハッシュを」)。また、私のJava実装を調べることもできます

ポイントの差を使用して中心点を計算している場合は、ハッシュ衝突の可能性をさらに減らすことができます。

int hash = numberOfPoints;
hash += 37 * geometryType;
...
hash = hash XOR geohash(someCenterPoint.lat, someCenterPoint.lon);
for(point : points) {
   hash += 37 * latToInteger(previousPoint.lat - point.lat);
   hash += 37 * lonToInteger(previousPoint.lon - point.lon);
}

たとえば緯度を整数に変換するには、次のようにします。

latAsInt = latitudeFloatValue * (Integer.MAX / 90)

または経度の場合:

lonAsInt = longitudeFloatValue * (Integer.MAX / 180)

私はハッシュの専門家ではないことを認めますが、実際には、人々は通常、識別のためにハッシュに依存しています。これは、衝突が発生する可能性が非常に低いためです。より高価な識別方法でより良い結果が得られますが、より大きな結果スペース(SHA1、SHA256)を備えたハッシュアルゴリズムを使用してそれを支援することもできると思います。その時点で、より複雑な比較がハッシュに対して十分速くなるかどうかはわかりません。
nicksan 2013年

私自身はハッシュエキスパートではありません:)!SHA-1(さらにはMD5)の衝突は非常にまれです。しかし、私の特定のハッシュ計算の利点の1つは(ただし、テストされていません!)計算が高速であるということです。ところで:intハッシュ値は、長いまたは偶数のバイト配列に増やすことができます
Karussell

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.