source code of java.lang.String of openjdk-1.6を見たとき、私はString.hashCode()は素数として31を使用し、今、私はこれを見てする理由は、私はハッシュコードを比較するかどうかを念頭に置いていた疑問だったString.hashCode()は非効率的ですか?
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
を計算することを見ましたがString.equalsはString.equalsを大幅に高速化します。しかし、今のhashCodeを見て、次の質問は、私の心に来る:
- が大きくプライム助け、より良い回避の衝突ではないでしょう、少なくとも短い文字列のために、例えばそれを見て「BC」を「同じハッシュを持っていますAb "(アスキー文字は地域65-122に住んでいるので、それよりも高い上位はない)
- 31をプライムとして使用するか、それが一般的であるために使用されるランダムなものを使用するのが意識的な決定ですか?
- 固定された文字列長の場合、ハッシュの衝突はどのくらいありえますか?この質問は、実際の内容を比較するのを避けるために、hashCodesとStringの長さを比較しても文字列をどれくらいよく比較できるかという元の質問です。
- 少し話題があります:多分理由はありますかString.equalsは追加のショートカットとしてhashCodesを比較しませんか?
- もう少しオフトピック:私たちはと同じという内容の2つの文字列を持っていると仮定しますが、実際に内容を比較することなく平等を宣言する方法はありますか?私は推測することはできませんが、文字列の長さに至るまで、スペースは必然的に衝突するサイズに爆発しますが、いくつかの制限については、特定の文字セット、最大の文字列の長さ、制限する必要がありますそのようなハッシュ関数を持つことができる文字列スペース?
オフトピック - 事実上2つのun-eqaul Stringオブジェクト**が**同じ 'hashCode()'を持つ可能性があるため、 'hashCode()'を使用することはできません – sanbhat
@sanbhat OPは 'hashCode '文字列'が本当にその内容を比較しなければならないかどうかを知る最初の方法です。 –
@sanbhat私はOPがこれを知っているという質問からはかなり明らかだと思います。関連する質問の部分は、「ハッシュコード」をショートカット「等価」に使用しない理由、つまりハッシュコードが異なる場合には等しくないことがあるかどうかを尋ねます。 – selig