2つの異なる文字列が同じハッシュコードを返すことができることを認識していますが、異なる長さの文字列を2つ見つけることができませんでした。これは可能なのか、もしそうなら、例が分かるだろう。これは、何か変更があった場合に備えて、javaのハッシュコード関数を使用しています。長さの異なる2つの文字列が同じハッシュコードを持つことはできますか?
答えて
ハッシュコードは、int
のスペースに分散しています。 int
の値は2^32 = ~4 billion
です。できるだけ多くの文字列が存在するので、ピジョンホールの原則では、同じハッシュコードを持つ複数の文字列が存在する必要があります。
しかし、これは以下のように同じ長さの文字列が同じハッシュコードを持つことは証明しません。 Javaでは、文字列のハッシュに式s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
が使用されています。これを知ると、同じハッシュコードを持つ異なる長さの文字列を構築するのは簡単です:
let String s1 = "\001!";
とString s2 = "@";
です。次にs1.length() != s2.length()
しかしs1.hashCode() == '\001' * 31 + '!' == 1 * 31 + 33 == 64 == s2.hashCode() == '@' == 64
。
しかし、あなたが想像するほど低くはないが、私は再びあなたのことを与えている、なぜならBirthday Paradoxの、その衝突のあなたの確率が低い、int
の 4オーバーの可能な値があるとしましょう約77Kハッシュ後に衝突の確率は約50%です(ハッシュは無作為に分散されていると仮定します。データは実際にあなたのデータに依存しています - 非常に小さい文字列を処理する場合は頻繁に衝突します)。ただし、ハッシング取引を使用するすべてのデータ構造は衝突に対処する必要があります(一般的な方法は、各ハッシュ位置でリンクリストを使用することです)。
これは長さの問題には答えません。たとえば、hashcodeがsomeFunction(theString)<< 16 |のようなものだった場合、長さ(theString)が異なる長さの文字列は、常に異なるハッシュコードを持ちます。 – user949300
あなたは正しいです、編集を追加しました。 – iobender
はい、これが起こります。
いくつかではなく些細な例:
- 初期ゼロ値の文字がハッシュコードに影響を与えるので、など(例えば)
"foo"
、"\0foo"
、"\0\0foo"
、していない、すべてが同じハッシュコードを持っています。 - 次の文字を追加する前に、各キャラクタに31が掛けられます。 2文字の文字列
new String(new char[] { 12, 13 })
は、単一文字new String(new char[] { 12 * 31 + 13 })
と同じハッシュコードを持ちます(ここでは12
と13
を任意に選択しました;12 * 31 + 13
アナログが2つの範囲内にとどまっている限り、他の値についても同じことが成り立ちます) -byte-unsigned-integer range)を指定します。
しかし、これらはほんの簡単に構成できる例です。また、それらの間に明白な関係がないにもかかわらず、同じハッシュコードを持つためにうまくいくストリングのペアがたくさんあります。
- 1. 同じハッシュコードを持つ2つの異なるオブジェクトの確定的なソート
- 2. 同じクラスの2つのクラスは同じハッシュコードを持ち、等しいと見なされますか?
- 3. 2つの異なる特殊文字が同じです
- 4. Python:同じ文字列のスライス、2つの異なる結果
- 5. 配列からのランダムな文字列、連続して選択された2つの同じ文字列を持つことはできませんJava
- 6. 同じバケットに異なるハッシュコードを持つキー。 C++
- 7. 2つのレルムモジュールが同じクラスを持つことはできますか?
- 8. pydot:2つの異なるノードを同じ文字列でプロットすることは可能ですか?
- 9. 同じコードが2つの異なるアプリで2つの異なることをしていますか?
- 10. 合計文字列 - Xpathを持つ2つの異なるノードの長さ - 2つのノードの文字列長の合計
- 11. php - 2異なる長さを示す同一の文字列
- 12. 異なる長さの2つのデータフレームで同じ値を見つける
- 13. Android - Deeplinking - 異なるクエリ文字列を持つ2つの同じURLを処理します。
- 14. 2つのスレッドが同じ配列の異なる要素に書き込むことはできますか?
- 15. 同じPERFORCEストリームに2つのビューを持つことはできますか?
- 16. 2つのNSWindowControllerを同じアプリに持つことはできますか?
- 17. 私は1つのasp.netプロジェクトの2つの異なるWeb設定で2つの接続文字列を持つことができます
- 18. 2つの文字列が同じ文字で
- 19. リアクション - 同じレンダリングで異なるロジックを持つ2つのコンポーネント
- 20. 2つの異なるロケーションマネージャ権限を持つことはできますか?
- 21. wchar_tの使用中に同じ内容の2つの文字列が異なるのはなぜですか?
- 22. 2つの異なるストリームからの2つの文字列を比較することは同じではありません。
- 23. R:2つのリストで同じ文字列を見つける
- 24. なぜ同じ機能が2つの異なることをしますか?
- 25. 同じIDを持つクエリ文字列で2つ以上の値を渡す
- 26. jqueryの同じクラスを持つ2つの異なるトリガ
- 27. 同じ名前の2つの異なるDLLを持つプロジェクト
- 28. merge data.frame 2つの列で長さと条件が異なる
- 29. 同じレールバックエンドを持つ2つの異なる反応アプリを構築することは可能ですか?
- 30. 2つのJava文字列が同じでないと言っています
おそらく関連性があり便利です:http://stackoverflow.com/questions/9364134/what-hashing-function-does-java-use-to-implement-hashtable-class –