Почему 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]);
}
Но это не дало желаемых результатов (возвратил хеш, соответствующий типу int
, что также ожидается с учетом внутренний макет десятичного числа). Так что реализация Decimal.GetHashCode()
пока мне неизвестна.
17f.GetHashCode() != 17d.GetHashCode()
соответствует ожиданиям? - person Magnus   schedule 02.09.2012GetHashCode
пытается быть уникальной только в пределах одного типа. Генерирует ли double и float один и тот же хэш-код или нет, это не имеет значения. - person Magnus   schedule 03.09.2012