2

各要素に3つのキー(2つの文字列と1つの整数)があり、ハッシュ関数を設計したいと思います。ハッシュテーブルを統一するために、3つのキーすべてを使用したいと思います。どの道をたどるべきですか?

private:
    string name; 
    int age;        
    string homeTown;  
4

1 に答える 1

2

最も単純な実装では、次のようにフィールドごとにキーの合計を使用します。

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   

ハッシュ関数の適切な設計は、実際には単純なトピックではなく、確率論を含みます。

于 2012-12-30T00:56:56.840 に答える