17m.GetHashCode() == 17d.GetHashCode()
(m=decimal, d=double)
さらに、予想どおり
17f.GetHashCode() != 17d.GetHashCode()
(f=float)
これは、 net3.5
と net4.0 の両方に当てはまるようです。
私が理解しているように、これらの型の内部ビット表現はまったく異なります。では、 decimal型とdouble型のハッシュ コードが等しく、初期化値が等しいのはなぜでしょうか? ハッシュの計算前に何らかの変換が行われていますか?
のソースコードは次のとおり
であることがわかりました。Double.GetHashCode()
//The hashcode for a double is the absolute value of the integer representation
//of that double.
//
[System.Security.SecuritySafeCritical] // auto-generated
public unsafe override int GetHashCode() {
double d = m_value;
if (d == 0) {
// Ensure that 0 and -0 have the same hash code
return 0;
}
long value = *(long*)(&d);
return unchecked((int)value) ^ ((int)(value >> 32));
}
このコードが目的の値を返すことを確認しました。しかし、 のソース コードは見つかりませんでしたDecimal.GetHashCode()
。メソッドを使ってみた
public static unsafe int GetHashCode(decimal m_value) {
decimal d = m_value;
if (d == 0) {
// Ensure that 0 and -0 have the same hash code
return 0;
}
int* value = (int*)(&d);
return unchecked(value[0] ^ value[1] ^ value[2] ^ value[3]);
}
しかし、これは望ましい結果と一致しませんでした (型に対応するハッシュを返しました。これは、 decimal の内部レイアウトをint
考慮すると予想されます)。したがって、の実装は現在のところ不明です。Decimal.GetHashCode()