非暗号化ハッシュの場合、Java はどのように機能しますString.hashCode()か?
ほとんどの場合、衝突が心配です。
ありがとう。
非暗号化ハッシュの場合、Java はどのように機能しますString.hashCode()か?
ほとんどの場合、衝突が心配です。
ありがとう。
.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
汎用ハッシュ関数としてはかなり優れています。つまり、通常は気にする必要はありません。
特に:
int。明らかに、これは暗号化ハッシュ関数ではないため、そのために使用しないでください。また、 32 ビットのハッシュを生成しているため、ハッシュの衝突が発生する可能性があることに注意してください。したがって、それを考慮してアルゴリズムを設計する必要があります。