したがって、長さnのchar *とintの2つの異なるフィールド型があります。私はキーとして両方を使用してハッシュ値を生成したい。私はint変数の最後の16ビットを追加し、合計整数xをコールし、次にcollate:hashを使用してchar *のハッシュ値を生成します。これは整数yと呼ばれます。次に、x + yを加算し、合計でハッシュを使用してハッシュ値を生成します。私は[1,4]の範囲にハッシュ値を制限したいと言うことができます。私はちょうど私が欲しいものを得るために%4をハッシュ値できますか?また、2つのキーからハッシュ値を生成するより良い方法がある場合は、私に教えてください。ハッシュ関数とその仕組み
0
A
答えて
0
[1,4]の範囲については、hashvalue%4
に1を加えなければなりません。ただし、4のハッシュは非常に小さいハッシュです。これにより、多くの衝突が発生し、ハッシュの有効性が制限されます(つまり、とは異なるフィールドの値がになります)。
サイズを追加することをお勧めします。ハッシュに、おそらく64K(16ビットハッシュ)。それは衝突を少なくします。また、すでにハッシュテーブルを実装しているstd::unordered_map
を使用しないでください。
最後に、ハッシュ関数ごとに、各フィールドの意味に依存します。たとえば、インプリメンテーションで整数の下位16ビットのみがカウントされる場合、ハッシュはそれらのビットのみに基づいている必要があります。文字列と整数には一般的なハッシュ関数があるので、それらの関数を使うことができます。最後に、両方のフィールドのハッシュ値を結合するには、それらを合計(またはxoring)するのが一般的な方法です。生成されたハッシュ値が可能な限り範囲内に均等に分散されていることを確認してください。だから、あなたは多くの言葉で説明すると書かれている
0
:
struct noname {
int ifield;
char[N] cfield;
};
int hash(const noname &n) {
int x = n.ifield;
int y = ???(n.cfield);
return x + y;
// return (x + y) & 3;
}
このハッシュ関数が良いかどうかは、データに依存します。たとえば、ifield
が常に4の倍数である場合、それは明らかに悪いです。フィールドの値がほぼ均等に分散されていれば、すべて問題ありません。
ハッシュ範囲を[1;4]
に制限するという要件を除いて、まず、[0;3]
は計算が簡単です。次に、ハッシュコードが生成される2つまたは3つの異なるものしか持たない場合、そのような小さな範囲が適切です。範囲は、予想される異なる要素の数の少なくとも2倍にする必要があります。
関連する問題
- 1. ARCとその仕組み
- 2. Swiftのコールアセンブリ関数の仕組み
- 3. session_start()関数の仕組みは?
- 4. Dictionary <TKey、TValue>でのハッシュ処理の仕組み
- 5. ウェブブラウザの仕組みに関するメンタルモデル
- 6. iTeleportの仕組み
- 7. Tensorflowの仕組み
- 8. Hibernate.initialize()の仕組み
- 9. ファイルディスクリプタの仕組み
- 10. フォースクエアチェックインの仕組み
- 11. Choreographerの仕組み
- 12. マルチキャストの仕組み
- 13. ハイブパーティションの仕組み
- 14. キュウリカピバラの仕組み
- 15. subscribeOnの仕組み
- 16. ボイスアシスタントの仕組み
- 17. サブドメインの作成方法とその仕組みは?
- 18. CA2000の仕組みとその回避策
- 19. 2再帰関数の追加の仕組み
- 20. 関数の仕組みを理解するのが難しい
- 21. djangoでカスタムモデルフィールドを作成する方法とその仕組み
- 22. 組み込み関数/組み込み関数のテスト
- 23. SynchromeshとReactiveRecordによる関連付けの仕組み
- 24. Racketのプリミティブと組み込み関数
- 25. .NETのコレクションとジェネリックの仕組みは?
- 26. PHPとのウェブサーバーインターフェイスの仕組み
- 27. ゴランのタイマーの仕組み
- 28. JsonUtilityのラッパーの仕組み
- 29. iPhoneのjailbreakingの仕組み
- 30. Codeigniterのセッションの仕組み