Delphi 2009では、TObjectにGetHashCode関数が追加されました。 GetHashCodeは、TDictionaryのハッシュに使用されるIntegerを返します。DelphiでGetHashCodeのdouble型を整数に変換する
オブジェクトがTDictionaryでうまく動作するようにするには、GetHashCodeを適切にオーバーライドして、一般に異なるオブジェクトが異なる整数ハッシュコードを返すようにする必要があります。
しかし、ダブルフィールドを含むオブジェクトではどうしますか?どのようにGetHashCodeの整数にこれらのdouble値を変換しますか?
Javaで通常行われる方法は、Double.doubleToLongBitsやFloat.floatToIntBitsなどのメソッドを使用することです。後者には、次のようなドキュメントがあります。「IEEE 754浮動小数点「単一形式」ビットレイアウトに従って、指定された浮動小数点値の表現を返します。これは、浮動小数点値の異なるビットに対する異なるマスクを用いたいくつかのビット演算を含む。
Delphiでこれを行う関数はありますか?
なぜ変更する必要がありますか?既定のGetHashCodeは、オブジェクトのメモリアドレスを返します。メモリアドレスは、定義によって各オブジェクトごとに一意です。 –
オブジェクトが辞書のキーとして機能するようにするには、Equalsをオーバーライドする場合はGetHashCodeをオーバーライドする必要があると思います。時には、同じインスタンスであるかどうかをテストするだけでなく、2つのオブジェクトが等しいかどうかをテストするためにオブジェクトのフィールドを比較するためにEqualsをオーバーライドしたい場合もあります。 –