0

OK、次の要件を満たすハッシュ関数が必要です。これは、同じ論理構造の一部であるが、ファイル システムの異なる物理領域に格納されているディレクトリをリンクできるようにすることを目的としています。

Java で実装する必要があります。実行セッション全体で一貫している必要があり、long を返すことができます。

ディレクトリ名/文字列をハッシュします。これは、と がそうであるように、"somefolder1""somefolder2"が異なるハッシュを返すよう"JJK"に動作するはず"JJL"です。また、衝突が発生する可能性が高い時期についても考えてみたいと思います。

助言がありますか?

ありがとう

4

4 に答える 4

4

ほとんどすべてのハッシュ関数には、入力の小さな変化が出力の大きな変化をもたらすという特性があります。つまり、「somefolder1」と「somefolder2」は常に異なるハッシュを生成します。

衝突に関しては、ハッシュ出力の大きさを見てください。Java 自身hashcode()は を返すため、たとえば、それぞれ 128 ビットと 160 ビットを生成するMD5またはSHA-1intよりも頻繁に衝突が予想されます。

ただし、そのような関数をゼロから作成しようとするべきではありません。

ただし、ユースケースで衝突が発生してはならないかどうか、またはまれに衝突が許容されるかどうかはよくわかりませんでした。フォルダーをリンクするために、複数回発生する可能性のあるものではなく、一意であることが保証された識別子を確実に使用します。

于 2010-01-22T12:54:19.043 に答える
2

異なる文字列が同じハッシュを返す必要がある状況については説明していません。

一般に、ハッシュ関数の設計には、最初に等価関数を実装することからアプローチします。これにより、ハッシュに含める必要があるデータのビットと、破棄する必要があるデータが表示されます。データの 2 つの異なるビット間の等価性が複雑な場合 (大文字と小文字を区別しないなど)、その特定の比較に対応するハッシュ関数が存在することを願っています。

何をするにしても、等しいハッシュが等しいキーを意味する (つまり、ハッシュが一意である) と想定しないでください。これは、常に潜在的な問題の原因となります。

于 2010-01-22T12:55:05.960 に答える
1

Javaの文字列ハッシュコードはあなたにを与えます、intあなたが望むならlong、あなたは文字列のためにMD5合計の最下位64ビットを取ることができます。

衝突が発生する可能性があります。システムはそのための準備が必要です。ハッシュコードの用途についてもう少し詳しく説明すると、衝突によって問題が発生するかどうかがわかります。

于 2010-01-22T13:30:59.463 に答える
1

M個の可能な値を持つ均一にランダムなハッシュ関数を使用すると、N回のハッシュ後に発生する衝突のオッズは次の場合に50%になります。

N = .5 + SQRT(.25 - 2 * M * ln(.5))

詳細な分析のために誕生日の問題を調べてください。

完全なハッシュを使用して、すべてのキーを事前に知っていれば、衝突を回避できます。

于 2010-01-22T13:48:05.707 に答える