Тот же GetHashCode () для разных объектов

1

После выполнения этой части кода:

int a = 50;
float b = 50.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());

Мы получаем False, что ожидается, поскольку мы имеем дело с разными объектами, поэтому мы должны получать разные хэши.

Однако, если мы выполним это:

int a = 0;
float b = 0.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());

Мы становимся True. Оба obejcts возвращают один и тот же хэш-код: 0.

Почему это происходит? Разве они не должны возвращать разные хеши?

  • 0
    не несаралы - они всего лишь целые.
  • 0
    посмотрите здесь: referenceource.microsoft.com/#mscorlib/system/… и referenceource.microsoft.com/#mscorlib/system/…
Показать ещё 3 комментария
Теги:
hashcode

4 ответа

3
Лучший ответ

GetHashCode System.Int32 работает следующим образом:

public override int GetHashCode()
{
    return this;
}

Который, конечно, с этим 0, он вернет 0.

System.Single (float - псевдоним) GetHashCode:

public unsafe override int GetHashCode()
{
    float num = this;
    if (num == 0f)
    {
        return 0;
    }
    return *(int*)(&num);
}

Как вы видите, в 0f он вернет 0.

Используемая программа - ILSpy.

  • 0
    Я думаю, это все объясняет :)
4

Из документации MSDN:

Два объекта, которые равны возвратным хеш-кодам, равным. Однако обратное неверно: равные хеш-коды не подразумевают равенства объектов, поскольку разные (неравные) объекты могут иметь одинаковые хэш-коды.

  • 1
    Это хорошо, чтобы узнать что-то новое!
1

Объекты, которые концептуально равны, обязаны возвращать одни и те же хэши. Объекты, которые отличаются друг от друга, не обязаны возвращать разные хэши. Это было бы возможно только в том случае, если бы существовало менее 2 ^ 32 объектов, которые могли когда-либо существовать. Их больше. Когда объекты, которые отличаются друг от друга, приводят к одному и тому же хэшу, это называется "столкновением". Хэш-алгоритм качества минимизирует как можно больше конфликтов, но их невозможно полностью удалить.

  • 0
    Не знал этого факта!
  • 0
    Разве ваше первое предложение не должно быть «Объекты, которые являются концептуально равными, обязаны возвращать одинаковые хеши»?
Показать ещё 1 комментарий
0

Почему они должны? Хэш-коды - это конечный набор; столько, сколько вы можете поместиться в Int32. Существует много много пар, которые будут иметь один и тот же хеш-код, как любой заданный int или любой другой двойной.

Хэш-коды в основном должны следовать двум простым правилам:

  1. Если два объекта равны, они должны иметь одинаковый хэш-код.
  2. Если объект не изменяет свое внутреннее состояние, хэш-код должен оставаться неизменным.

Ничто не обязывает два объекта, которые не равны другим хэш-кодам; это математически невозможно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню