C #: один и тот же объект должен иметь тот же HashCode? - PullRequest
3 голосов
/ 01 августа 2011

Предположим, у меня есть два объекта с именами K и M

if(K.Equals(M))
{

}

Если это так, K и M всегда имеют одинаковые HashCode?

Или это зависит от языка программирования?

Ответы [ 7 ]

5 голосов
/ 01 августа 2011

Контракт для GetHashCode() требует этого, но, поскольку каждый может сделать свою собственную реализацию, это никогда не гарантируется.

Многие классы (особенно хеш-таблицы) требуют его для правильного поведения.

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

Если вы реализуете служебный метод / класс, вы можете предположить, что два равных объекта имеют одинаковый хеш-код (если нет, то это глючит другой класс, а не ваш).

Если вы реализуете что-то с последствиями для безопасности, вы не можете принять это.

2 голосов
/ 01 августа 2011

Если это правда, K и M всегда имеют один и тот же HashCode?

Да.

Или, скорее, должно иметь место.Потребители хеш-кодов (например, контейнеры) могут предполагать, что равные объекты имеют равные хеш-коды, или, скорее, неравные хеш-коды означают, что объекты неравны.(Неравные объекты могут иметь один и тот же хэш-код: существует больше возможных объектов, чем хэш-кодов, поэтому это должно быть разрешено.)

Или это зависит от языка программирования?

Нет

1 голос
/ 01 августа 2011

Если это правда, K и M всегда имеют один и тот же HashCode?

Да.Если только у них нет злонамеренного переопределенного метода Equals.Но это будет считаться неработоспособным.

Но обратите внимание, что обратное неверно,
, если K и M имеют один и тот же HashCode, все равно может быть, что K.Equals(M) == false

1 голос
/ 01 августа 2011

Да, он должен возвращать тот же хеш-код.

Я бы сказал, что он не зависит от языка.Но нет гарантии, как если бы другие программы реализовали это правильно.

GetHashCode возвращает значение, основанное на текущем экземпляре, которое подходит для алгоритмов хеширования и структур данных, таких как хеш-таблица.Два объекта одинакового типа и одинаковые должны возвращать один и тот же хэш-код, чтобы гарантировать правильную работу экземпляров System.Collections.HashTable и System.Collections.Generic.Dictionary.

0 голосов
/ 01 августа 2011

GetHashCode() может вернуть один и тот же хеш для разных объектов.Вы должны использовать Equals() для сравнения объектов, отличных от GetHashCode(),, в случае, когда GetHashCode() возвращает то же значение - реализация Equals() должна учитывать другие проверки на равенство объектов.

Хеш-структура данных, способная обрабатывать такие случаииспользуя алгоритмы разрешения коллизий.

из wikipedia :

Хеш-коллизии практически неизбежны при хешировании случайного подмножества большого набора возможных ключей.Например, если 2500 ключей хэшируются в миллион блоков, даже при совершенно равномерном случайном распределении, в соответствии с проблемой дня рождения, существует 95% -ная вероятность того, что по крайней мере два ключа будут хэшированы в один и тот же слот.

Следовательно, большинство реализаций хеш-таблиц имеют некоторую стратегию разрешения коллизий для обработки таких событий.Некоторые общие стратегии описаны ниже.Все эти методы требуют, чтобы ключи (или указатели на них) были сохранены в таблице вместе со связанными значениями.

0 голосов
/ 01 августа 2011

в вашем приложении хеш-код должен однозначно идентифицировать экземпляр объекта.это часть платформы .net, поэтому значение хэш-кода должно работать независимо от того, на каком языке .net вы пишете.

0 голосов
/ 01 августа 2011

Зависит от Равной реализации объекта. Он может использовать GetHashCode под капотом, но он тоже не имеет. Таким образом, в основном, если у вас есть объект с пользовательской реализацией Equals, HashCode может отличаться для обоих объектов.

...