私は文字列の配列を持っています。配列の長さはnです。どのように各文字列のハッシュキーを計算するので、各キーは0..nの範囲の数値になりますか? )範囲0の計算ハッシュ関数
答えて
アレイの内容を最初に調べることなく、ハッシュ関数を選択することはできません。ハッシュ関数を選択し、配列を選択させるとしましょう。 2n文字列を生成し、ハッシュ関数を適用し、結果をソートします。 2n個の文字列とn個の可能な値だけが衝突する必要があるので、たくさんの衝突を含むn個の文字列を選択し、それらをハッシュして衝突を観察するために戻します。
ハッシュ関数を選択するために、事前に文字列を分析する準備ができている場合、開始点の1つまたは検索語のソースは、http://en.wikipedia.org/wiki/Perfect_hash_functionの「最小完全ハッシュ関数」になります。
また、これが本当に必要なものであるかどうか、あまり完全でないハッシュ関数の使用を検討できるかどうかを検討することもできます。私はhttp://en.wikipedia.org/wiki/Cuckoo_hashingの外観が好きです。
なぜハッシュキーとして配列のインデックスを使用しない、それは私を助けるために誰かに助けになる場合
UPDATE
アレイの項目は、文字列が、数値ではないだろうか?
はモジュロNを試してみてください。
int N = array.Length;
int hashMaxN = strings[i].GetHashCode() % N;
これは、異なるインデックスの一意のハッシュを保証するものではありません。しかし、ハッシュコードは一意ではありません。
リスト内の各文字列に割り当てられた固有のIDが必要な場合は、anothe Rの答えからの提案を使用します。個別の文字列
int itemHash = myList.Distinct().OrderBy(s => s).IndexOf(item);
これは、プロパティを持っていますがソートされた配列内の文字列のインデックスを選びますリストがどのように順序付けされているかにかかわらず同じ文字列に対して同じであることを示します。しかし文字列をリストに追加すると、アイテムのハッシュコードが変更されます。
ハッシュを構築するアルゴリズムが必要です。しかし、モジュロでのあなたのアプローチでさえ、うまくいきません - 例えば31%3 = 1と13%3 = 1のように、結果のハッシュの一意性を保証しません。 –
私の答えを編集しました。通常、ハッシュコードは、一意である必要はありません(ただし、ハッシュテーブルでのパフォーマンスのためにできるだけ少ない数のコリジョンを持つようにしようとします)。 –
ゲームでは遅くなっていますが、このトピックは最近これまでに見たものよりnicer solutionで再び現れました。
は例えば、CRC32ハッシュを取り、所望の範囲内の数を取得するために剰余を使用:
crc32(str) % 5 // returns either 0, 1, 2, 3, 4
- 1. ハッシュ関数の計算
- 2. UISliderの値を範囲から範囲に計算する方法0-1.0
- 3. 範囲スライダの計算機
- 4. サブネットCIDR範囲を計算
- 5. 数学:範囲内の合計IPSを計算する
- 6. 平均計算の範囲のSQLクエリ
- 7. ステレオ - 奥行き範囲の計算
- 8. 計算IP IPでの範囲
- 9. ビン内の範囲を計算する
- 10. ケラス - 範囲[0-100]内の数値の目的関数
- 11. バイト範囲ダイジェストを計算する
- 12. 色の色相を0から255の範囲として計算する
- 13. 日付範囲の曜日の数を計算する
- 14. 0の範囲外です。[0 ... 0]
- 15. Javascriptの数値範囲を計算する
- 16. Excel VBA複数の範囲から異なる値を計算
- 17. C#与えられた範囲ごとに関数を計算する
- 18. SHA256ハッシュ計算
- 19. C++平均計算関数0返信0
- 20. 日付範囲フィールドの範囲集計
- 21. 範囲内の関数内のjavascript変数の範囲
- 22. 引数 '0'が範囲外エラーです
- 23. エラー "引数 '0'が範囲外です"
- 24. コールバック関数の範囲
- 25. PHP関数の範囲
- 26. リストインデックスの範囲外リスト[0]
- 27. 複数の範囲でカバーされた合計スプレッドを計算する
- 28. 整数を指定された範囲にマッピングするためのハッシュ関数?
- 29. 2つの入力からハッシュ値を計算するCRC16ハッシュ関数
- 30. Hiveで既存のハッシュ関数を使用せずにハッシュを計算する
を、私は異なる位置に2つの同じ文字列を持っている場合はどう?それらのハッシュは文字列が等しい間に異なっているでしょう。 –
配列をソートするだけで、一意の要素のみを使用します。 – buddhabrot
彼は 'O(log(N))'プローブをリストに入れたくないかもしれません。ハッシュ関数は定数wrt 'N'(キーの長さだけではありません)です。 – phs