2016-12-10 12 views
4

Delphiプロジェクト(RAD Studio XE7で構築)では、ブラシの辞書を作成したいと思います。各辞書項目にはキーとしてのTMyBrushオブジェクトが含まれ、取得するブラシとGDI +ブラシが値として含まれています。GetHashCodeの良い実践ですか?

TMyBrushクラスは3つのフィールド

  • ブラシの種類を決定する列挙型(固体、勾配、...)のブラシ内容(色、ラップモードを説明
  • A TBrushInfoクラスを含みます私の辞書に

クランプフィールドを表し、...)

  • A TRect、私は彼の特性上、およびない彼のインスタンスに基づいてブラシを取得したいです。たとえば、ローカルのTMyBrushインスタンスを作成し、黒い実線に設定し、TryGetValue()関数を使用して一致するGDI +値を取得することで、辞書から黒い実線のブラシを取得したいとします。そのために、TMyBrushComparerを作成しました。

    Equals()関数を記述することは問題ではありません。しかし、私はGetHashCode()関数を記述するのがベストプラクティスであるかどうかわかりません。私はこのような関数を書く傾向があります:

    function TMyBrushComparer.GetHashCode(const pValue: TMyBrush): Integer; 
    begin 
        Result := BobJenkinsHash(pValue, SizeOf(TMyBrush), 0); 
    end; 
    

    しかし、私はそれは正しい練習ではないと感じています、それは正しいですか?だから、私のTMyBrushComparerのために良いGetHashCode()関数を書くベストプラクティスは何ですか?

    よろしく

  • 答えて

    3

    問題のコードは、オブジェクトのアドレスではなく、その値をハッシュし、その平等のあなたの定義と一致していません。

    あなたの等価性の定義は、3つのフィールドが等しいことです。あなたのハッシュ関数は、その定義と一致する必要があります。 3つのフィールドのそれぞれをハッシュし、値を結合します。たとえば、ここに示したアプローチを使用します。https://stackoverflow.com/a/263416/505088

    2つのフィールドは値型です。彼らは価値アイデンティティと一致するようにハッシュするのは簡単です。ブラシ情報フィールドは、参照タイプとして表示されます。だから、あなたはどんなアイデンティティ(参照アイデンティティ、バリューアイデンティティ、あるいは他の何か)を望んでいるかを決める必要があります。そして、一致する等価性テストとハッシュを実装します。

    関連する問題