Есть ли способ определения размера значения ключа? - PullRequest
1 голос
/ 25 апреля 2011

В C # есть ли способ определения размера ключа при создании новой хеш-таблицы?

Hashtable myHash = new Hashtable();

Я хочу использовать длинное значение для размера ключа, но, похоже, он превышает доступныйразмер ключа, поскольку я получаю отрицательные числа.Я умножаю вместе некоторые простые числа, наибольшее возвращаемое значение составляет 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 = 1801152661463.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

Прежде всего вы должны использовать HashSet<T>, если вы используете .net 3.5 или новее, и Dictionary<T,bool>, если вы используете .net 2. Общие коллекции предлагают лучшие проверки времени компиляции, меньше приведения и меньше бокса.

Переполнение int, скорее всего, происходит перед вставкой в ​​Hashtable в вашем текущем коде.Итак, вы заметили, что ошибка, скорее всего, не связана с Hashtable, но это ошибка в вашем арифметическом коде.Вам, вероятно, нужно привести что-то к long.Но если вы не отправите соответствующий код, я не могу сказать вам, где именно происходит переполнение.

0 голосов
/ 25 апреля 2011

Поскольку метод System.Object GetHashCode() возвращает целое число, я бы сказал, что ваш алгоритм выбора хеш-кода ограничен теми, которые возвращают 32-битное значение (хотите ли вы назвать его подписаннымили unsigned не делает различий: значение хеша является просто произвольным 32-разрядным значением).

И HashTable не волнует, какие у вас ключи или значения: насколько это важно, ониоба просто объекты.Возможно, вы захотите убедиться, что вы правильно переопределяете и используете GetHashCode() и Equals().Возможно, стоит подумать и о вашей реализации IComparable.

0 голосов
/ 25 апреля 2011

Классы .NET Hashtable и HashSet<T> вызывают object.GetHashCode() для получения хэша.Поскольку GetHashCode() возвращает int, это размер используемого хеш-ключа.

Если вы хотите предоставить свою собственную хеш-функцию, вы можете переопределить GetHashCode() в типевы будете вставлять или определять пользовательский IEqualityComparer<T> и передавать его конструктору HashSet.Однако метод IEqualityComparer<T>.GetHashCode() также возвращает целочисленный ключ, поэтому я не уверен, что он будет соответствовать вашим потребностям.

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

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