0

重複の可能性:
Java の String.hashCode() が競合の少ない方法で実装されていないのはなぜですか?

非暗号化ハッシュの場合、Java はどのように機能しますString.hashCode()か?

ほとんどの場合、衝突が心配です。

ありがとう。

4

2 に答える 2

4

.hashCode()Javaに関して、より具体的には、によって指定された.equals()/.hashCode()コントラクトについて、何のためにあるのかを誤解しているようですjava.lang.Object

誰にとっても重要な契約の唯一の部分は、2 つのオブジェクトが に関して等しい場合.equals()、それらは によって返されるものと同じハッシュ コードを持たなければならないということ.hashCode()です。その契約には他の義務はありません

したがって、次のようなカスタム.hashCode()実装を作成することは完全に合法ですが、これは考えられる限り最適ではありません。

@Override
public int hashCode()
{
    // Legal, but useless
    return 42;
}

もちろん、JDK 開発者はそれほど厚くはありません。.hashCode()ビルトイン型 ( を含む) の実装はString十分に優れているため、衝突について心配する必要さえありません。それでも、この実装はJDK実装ごとに異なる可能性が高く、その「暗号化値」も異なります。

しかし、それは重要ではありません。

考慮すべき最も重要なことは、暗号化とはまったく.hashCode()関係がないということです。その唯一の義務は、 によって定義されたコントラクトに従うことです。java.lang.Object

于 2013-01-05T01:52:20.467 に答える
0

汎用ハッシュ関数としてはかなり優れています。つまり、通常は気にする必要はありません。

特に:

  • CPUがメモリから文字列を読み取ることができるため、おそらくハッシュを生成する程度に高速です(つまり、通常、文字列の大部分をスキップせずに改善することはできません)。これは、文字列内の文字ごとに 1 回の乗算と 1 回の加算のみを行います。
  • ランダムな文字列の典型的なセットの場合、範囲全体に分散されたハッシュが生成されますint

明らかに、これは暗号化ハッシュ関数ではないため、そのために使用しないでください。また、 32 ビットのハッシュを生成しているため、ハッシュの衝突が発生する可能性あることに注意してください。したがって、それを考慮してアルゴリズムを設計する必要があります。

于 2013-01-05T01:47:34.700 に答える