Согласно MSDN, хеш-функция должна иметь следующие свойства:
Если два объекта сравниваются как равные, метод GetHashCode для каждого объекта должен возвращать одно и то же значение. Однако, если два объекта не сравниваются как равные, методы GetHashCode для двух объектов не должны возвращать разные значения.
Метод GetHashCode для объекта должен последовательно возвращать один и тот же хэш-код, если не существует модификации состояния объекта, которая определяет возвращаемое значение метода Equals объекта. Обратите внимание, что это верно только для текущего выполнения приложения и что другой хэш-код может быть возвращен, если приложение снова запущено.
Для лучшей производительности хеш-функция должна генерировать случайное распределение для всех входных данных.
Я продолжаю находить себя в следующем сценарии: я создал класс, реализованный IEquatable<T>
и переопределенный object.Equals(object)
. MSDN утверждает, что:
Типы, которые переопределяют Equals, также должны переопределять GetHashCode; в противном случае Hashtable может работать некорректно.
И тогда он обычно немного останавливается для меня. Потому что, как вы правильно переопределяете object.GetHashCode()
? Никогда не знаю, с чего начать, и кажется, что у него много подводных камней.
Здесь, в StackOverflow, существует немало вопросов, связанных с переопределением GetHashCode, но большинство из них, по-видимому, относятся к конкретным случаям и конкретным проблемам. Поэтому я хотел бы получить хорошую компиляцию здесь. Обзор с общим советом и рекомендациями. Что делать, что не делать, общие ловушки, где начать и т.д.
Я хотел бы, чтобы он был особенно направлен на С#, но я бы подумал, что он будет работать одинаково для других языков .NET(?).
Я думаю, что, может быть, лучший способ - создать один ответ на тему с быстрым и коротким ответом сначала (рядом с одним лайнером, если это вообще возможно), тогда, возможно, еще немного информации и закончите с соответствующими вопросами, обсуждениями, сообщениями в блоге и т.д., если они есть. Затем я могу создать одно сообщение в качестве принятого ответа (чтобы получить его сверху) только с "оглавлением". Постарайтесь держать его коротким и кратким. И не просто ссылку на другие вопросы и сообщения в блоге. Попытайтесь взять их суть, а затем скорее обратитесь к источнику (особенно потому, что источник может исчезнуть. Также попробуйте отредактировать и улучшить ответы вместо созданных очень похожих.
Я не очень хороший технический писатель, но я по крайней мере попытаюсь отформатировать ответы, чтобы они выглядели одинаково, создавали оглавление и т.д. Я также попытаюсь найти некоторые из связанных вопросов здесь, в SO, что ответы на некоторые из них и, возможно, вытащить сущность тех, которыми я могу управлять. Но поскольку я не очень стабилен в этой теме, я постараюсь держаться подальше по большей части: p