.NET: гарантированно ли Type.GetHashCode уникален? - PullRequest
10 голосов
/ 18 сентября 2011

У меня есть кто-то, использующий Type.GetHashCode, как если бы это был первичный ключ. Я думаю, что это ужасная идея, но я хотел знать, был ли какой-то особый документированный случай, в котором говорилось, что два типа не будут иметь одинаковый хэш-код.

Ответы [ 3 ]

14 голосов
/ 18 сентября 2011

В отношении GetHashCode нет никаких гарантий, за исключением того, что он, вероятно, будет случайным образом распределенным , а не уникальным. Документация специально упоминает, что:

Реализация по умолчанию метода GetHashCode не гарантировать уникальные возвращаемые значения для различных объектов . Более того, .NET Framework не гарантирует реализацию по умолчанию метод GetHashCode, и возвращаемое значение будет таким же между разными версиями .NET Framework. Следовательно, реализация по умолчанию этого метода не должна использоваться как уникальная Идентификатор объекта для целей хеширования. ... если два объекта не сравниваются как равные, методы GetHashCode для двух объектов не должны возвращать разные значения .

Рекомендуется случайное распределение, чтобы избежать коллизий хешей (медленные словари):

Для лучшей производительности хеш-функция должна генерировать случайную распределение для всех входных данных.

Также очень плохая идея - сохранять результаты GetHashCode и основывать любые решения на этом постоянном значении. Один и тот же объект может вернуть другой хеш-код при следующем выполнении приложения:

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

Сам CLR изменен Реализация GetHashCode для строки между .NET 1 и .NET 2 и использует другой алгоритм хеширования для 32- и 64-разрядных версий.

С Рекомендации и правила для GetHashCode :

GetHashCode предназначен только для одного: балансировки хеш-таблицы. Делать не используйте его ни для чего другого.

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

8 голосов
/ 18 сентября 2011

Это не гарантированно будет уникальным.

Если ваши сборки имеют строгое имя, вы можете использовать полное имя типа в качестве уникального ключа для идентификации Type.

1 голос
/ 18 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...