В отношении GetHashCode нет никаких гарантий, за исключением того, что он, вероятно, будет случайным образом распределенным , а не уникальным. Документация специально упоминает, что:
Реализация по умолчанию метода GetHashCode не
гарантировать уникальные возвращаемые значения для различных объектов . Более того,
.NET Framework не гарантирует реализацию по умолчанию
метод GetHashCode, и возвращаемое значение будет таким же
между разными версиями .NET Framework. Следовательно,
реализация по умолчанию этого метода не должна использоваться как уникальная
Идентификатор объекта для целей хеширования. ... если два объекта не сравниваются как равные, методы GetHashCode для двух объектов не должны возвращать разные значения .
Рекомендуется случайное распределение, чтобы избежать коллизий хешей (медленные словари):
Для лучшей производительности хеш-функция должна генерировать случайную
распределение для всех входных данных.
Также очень плохая идея - сохранять результаты GetHashCode и основывать любые решения на этом постоянном значении. Один и тот же объект может вернуть другой хеш-код при следующем выполнении приложения:
Метод GetHashCode для объекта должен последовательно возвращать один и тот же
хэш-код до тех пор, пока нет изменений в состоянии объекта, которое
определяет возвращаемое значение метода Equals объекта. Обратите внимание, что
это верно только для текущего выполнения приложения, и
что другой хэш-код может быть возвращен, если приложение запущено
снова .
Сам CLR изменен Реализация GetHashCode для строки между .NET 1 и .NET 2 и использует другой алгоритм хеширования для 32- и 64-разрядных версий.
С Рекомендации и правила для GetHashCode :
GetHashCode предназначен только для одного: балансировки хеш-таблицы. Делать
не используйте его ни для чего другого.
Вы должны посмотреть криптографические хеши , если хотите почти уникальный хеш-код, основанный на значении объекта.