非暗号化ハッシュの場合、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 ビットのハッシュを生成しているため、ハッシュの衝突が発生する可能性があることに注意してください。したがって、それを考慮してアルゴリズムを設計する必要があります。