1. ホーム
  2. java

[解決済み] Java文字列のhashCode()の整合性

2022-05-16 20:46:11

質問

Java文字列のhashCodeの値は、次のように計算されます。 文字列.hashCode() ):

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

以下の式がfalseと評価されるような状況(JVMのバージョン、ベンダーなど)はありますか?

boolean expression = "This is a Java string".hashCode() == 586653468

更新その1です。 もしあなたが、答えは「はい、そのような状況もあります」と言うのであれば、「これはJavaの文字列です」(".hashCode() != 586653468) という具体例を示してください。なるべく具体的な例を挙げてください。

更新その2。 私たちは皆、hashCode()の実装の詳細に依存することが一般的に悪いことだと知っています。しかし、私は特に String.hashCode() について話しているので、答えを String.hashCode() に集中させておいてください。Object.hashCode()は、この質問の文脈ではまったく無関係です。

どのように解決するのですか?

Java 1.2までさかのぼったドキュメントを見ることができます。

というのは事実ですが 一般に はハッシュコードの実装が同じままであることを信頼すべきではありませんが、現在では、ハッシュコードの実装が同じであることを信頼することができます。 java.lang.String の動作として文書化されているので、それを変更することは既存の契約を破ることになります。

可能な限り、バージョン間で同じであるハッシュコードに頼るべきではありませんが、私の考えでは java.lang.String は特別なケースだと思います。 があるためです。 もちろん、アルゴリズムが指定される前のリリースとの互換性を放棄している限りにおいて、です。