2011-11-13 3 views
0

Javaがjava.lang.Stringのハッシュコードを計算する方法をOracleが変える可能性はありますか?Javaがjava.lang.Stringのハッシュコードを計算する方法をOracleが変える可能性はありますか?

私は、Javaのドキュメントごとに、ハッシュコードは、文字列に対して計算される方法に依存して最適化を作ってるんだ

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

http://download.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode()のJavaDocは、同じように多くのインターフェイスを指定

+2

今後のアルゴリズムの変更について本当に心配しているのであれば、問題のアルゴリズムを独自のコードにするだけではどうですか?ドキュメントはアルゴリズムを提供しますが、期待通りに動作するかどうかを絶対に確認する必要がある場合は、再実装してください。 – Michael

+0

あなたは明白な解決策を無視しました。オラクルは独自のコードを変更します - ハッシュします。そして、あなたには、さまざまなJVMがあります。 – ThomasRS

答えて

5

メソッドそのもの。あなたはそれに頼ることができます。

1

可能性はわかりませんが、既存のハッシュコードの実装を自分のユーティリティクラスにコピーし、それを使ってハッシュコードを生成することができます。 Apache Harmony JDKは別のアルゴリズムを使ってHashcodeを計算しています。

1

絶対にありません!その理由は、Java 7には文字列のswitch文があるからです。これが実装されている方法は本当に

switch (myString) { 
     case "hello": 
      ........... 
} 

のようにこれが何を意味するのか

switch (myString.hashCode()) { 
    case 3225263456234: //the hashcode of "hello" 
      ...... 
} 

なっているコンパイル時のhashCode(コードをコンパイルするために使用されるJDK)は、ランタイムJREと同じでなければならないということです。したがって、Java 7でコンパイルしていくつかのJava 10バージョンで実行すると、hashCodeは同じままでなければなりません。

+0

ILからネイティブに翻訳されているので、ハッシュを行うことはJITの仕事ではないでしょうか? –

関連する問題