5

私の問題はこれです。データのブロックがあります。時折、このデータブロックが更新され、新しい変更されたバージョンが表示されます。私が見ているデータが私が受け取ることを期待しているバージョンと一致するかどうかを検出する必要があります。

「期待される」バージョンのデータを完全に保存しないようにするために、フィンガープリントを使用することにしました。この種のものの「デフォルト」の選択はMD5ハッシュのようです。

ただし、MD5は暗号的に安全になるように設計されています。はるかに高速なハッシュ関数があります。CityHashやSpookyHashなどの最新の非暗号化関数を見ています。

システム内のすべてのデータを制御しているので、変更されたデータブロックが同じ値にハッシュされる偶発的な衝突のみを気にします。したがって、暗号化ハッシュの「攻撃者に強い」性質について心配する必要はなく、より単純なハッシュ関数で解決できると思います。

この目的でCityHashやSpookyHashなどのハッシュ関数を使用することに問題はありますか?それともMD5を使い続ける必要がありますか?または、Rabin指紋など、指紋用に特別に設計されたものを使用する必要がありますか?

4

2 に答える 2

1

はい、大丈夫です(さらに高速なCRCシリーズの関数も見てください)。ただし、データを区別するためにハッシュを使用することは避けがちです。シリアル番号を日付/時刻の値と組み合わせて使用​​すると、どのバージョンが新しいかを判断し、非同期の変更を検出する手段が提供されます。指紋は、バージョン管理ではなく、破損したファイルを検出するために使用されます。

あるデータセットを別のデータセットと比較する場合は、ハッシュ/フィンガープリントを使用せず、データを直接比較するだけです。2つのストリームのハッシュを取得してからハッシュを比較するよりも、2つのストリームを比較する方が高速です。

とはいえ、多くのファイルを比較するための簡単な方法は、各ファイルのハッシュを取得してからハッシュを比較し、ハッシュが一致する場合は生のバイトを比較することです。ハッシュ衝突の可能性は確かに最小限ですが、それは不可能ではありません-そして私は絶対に確信したいです。

于 2012-09-08T20:57:27.053 に答える
1

MD5、SHA1などの暗号化ハッシュよりも高速で衝突耐性の高いRabinハッシュを使用することをお勧めします。Javaの実装はここにあります。Web規模の企業による大規模な重複排除の取り組みのほとんどは、Rabin Hashを利用しています(たとえば、Henzingerが主導するGoogleの取り組みを参照してください)。

于 2013-10-23T20:50:58.360 に答える