2013-05-08 23 views
6

は、javaのhashCode()決定的ですか?javaのhashCode()は決定的ですか?

私は、ハッシュアルゴリズムを使用するドキュメント検索エンジンを実装しようとし、ハッシュコードを使用して単語をハッシュします。 私はそれを実行するたびに同じ単語が同じハッシュになるでしょうか?

別のマシン(32ビットと64ビット)から実行した場合でも同じハッシュが得られますか?

+1

私はそのハッシュがオブジェクトのアドレスに関連する可能性があり、実行から次のものに変更する可能性もあります... –

+0

http: //stackoverflow.com/questions/1516843/java-object-hashcode-result-constant-across-all-jvms-systems – Annabelle

+0

友人にサンプルコードを実行して見せてみませんか?なぜ私たちはすべてそれを行うことができますコードの小さな小片を投稿しないでください? :)つまり、私は* hashCodeは複数の実行間で一貫しているとは思っていません。 – Shark

答えて

9

それはあなたが参照しているクラスに依存します。合理的に実用的である限り

、クラス・オブジェクトによって定義されるhashCodeメソッドは、異なるオブジェクトについては異なる整数値を返すん:stated in the documentationとして、以降ベースObject.hashCode実装はありません。 (これは、典型的には、整数にオブジェクトの内部アドレスを変換することによって実現されるが、この実装技術はのJavaTMプログラミング言語で必要とされない。)

アドレスは、決定的ではない時々彼らもあることを考えますエントロピーの源として使用される。

しかし、例えば、Stringは次のように決定し、決定論ハッシュコードを有する:

Formula from Wikpedia

(画像はウィキペディアから取られた)

いくつかの場合においてための賢明な決定論的な定義も存在しませんハッシュコード

+0

+1ただし、[javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#hashCode%28%29)をWikipediaではなく参照として使用してください。 – assylias

+2

私は、式のイメージがWikipediaからコピーされたとだけ述べました。明らかにした。 –

4

のhashCodeの一般的な契約がJavadocとしてあると言う:それはJavaアプリケーションの実行中に複数回同じオブジェクトで呼び出されるたび

、hashCodeメソッドは一貫していない提供、同じ整数を返さなければなりませんオブジェクトの等価比較で使用される情報が変更されます。 この整数は、アプリケーションの1回の実行から同じアプリケーションの別の実行まで一貫している必要はありません。同じ単語(I単語がStringインスタンスとequals()Stringに変更されていると仮定)にhashCode()を呼び出すアプリケーションの実行中

Is the same word going to get the same hash every time that I run it?

は、同じ整数を返すべきです。

EDITString.hashCode()ためjavadocは、文字列のハッシュコードが計算される方法を指定しているので、それが決定的です。

Returns a hash code for this string. The hash code for a String object is 
computed as : 
s[0]*31^(n-1) + s 1 *31^(n-2) + ... + s[n-1]

+4

あなたの答えは混乱しています。 'hashcode'はマシンが32ビットか64ビットかにかかわらず、文字列に対して明確に定義され、確定的です – assylias

+0

編集済み!!!!!!!!!! – NINCOMPOOP

+1

@assyliasはい、実際にDoSのリスクになる可能性があります!攻撃者は、〜O(1)ハッシュマップを効果的にO(N)リンクリストに変換する、同じハッシュ値を持つように意図的に設計された一連の文字列(env varsとquery params)でHTTPリクエストを構築できます。 Womp womp。 – yshavit

3

一般的なオブジェクトといえば、そうではありません。

あなたはspecificiallyについてStringを話している場合しかし、その後、ハッシュコードの計算が明示的にString.hashCode()のAPIで指定されています

この文字列のハッシュコードを返します

。Stringオブジェクトのハッシュコードは、INT演算を使用して

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

として計算され、ここで、s [i]は文字列のi番目の文字であり、nは文字列の長さであり、^はべき乗を示します。 (空文字列のハッシュ値はゼロです。)

つまり、文字列に対して安定したhashCodeに依存できるはずです。

関連する問題