各要素に3つのキー(2つの文字列と1つの整数)があり、ハッシュ関数を設計したいと思います。ハッシュテーブルを統一するために、3つのキーすべてを使用したいと思います。どの道をたどるべきですか?
private:
string name;
int age;
string homeTown;
各要素に3つのキー(2つの文字列と1つの整数)があり、ハッシュ関数を設計したいと思います。ハッシュテーブルを統一するために、3つのキーすべてを使用したいと思います。どの道をたどるべきですか?
private:
string name;
int age;
string homeTown;
最も単純な実装では、次のようにフィールドごとにキーの合計を使用します。
return fieldA.getHashCode() + fieldB.getHashCode() + fieldC.getHashCode();
私はほとんどの場合このアプローチを使用します。ただし、キーカーディナリティが実際に「最もユニークな」動作に影響を与えるため、これは最適な設計ではありません。ハッシュキーの設計目標は単純です。数バイトでオブジェクトデータの最も一意の表現を取得するため、実際には「fieldA」の論理的な重みが大きい場合は、次のような多項式を使用することをお勧めします。
a^2 + b*2 + c //where a,b,c are hashes of fields
また
a^3 + b^2 + c ^1
指数部分は、位置に異なる重みを割り当てるため、線形合計よりも優れた結果を生成します。したがって、2番目と3番目のフィールドが同じハッシュを生成する場合でも、結果は異なります。
10 + 2 + 18 = 18 + 10 + 2
しかし
10^3 + 2^2 + 18 != 18^3 + 10^2 + 2
ハッシュ関数の適切な設計は、実際には単純なトピックではなく、確率論を含みます。