2016-01-10 4 views
0

Я реализую хэш-таблицу, и я использую GetHashCode для получения уникального хэш-кода для каждой используемой мной клавиши, однако, когда я вызываю key.GetHashCode(), функция возвращает ключ. После того, как я использую modulo для получения правильного ведра хэш-таблицы, мы можем реализовать хэш-таблицу, но это выглядит не так.key.GetHashCode() возвращает ключ

Вот как я это называю.

public V Find(K key) 
    { 
     int bucketIndex = key.GetHashCode() % N; 
     return buckets[bucketIndex].Find(key); 
    } 

Есть ли специальная инициализация, которую мы должны сделать до вызова gethashcode?

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

+0

Можете ли вы дать минимальный, но полный пример, который воспроизводит вашу проблему? –

+0

Документация по упоминанию «GetHashCode» не использует стандартную реализацию этого метода как уникальный идентификатор объекта для целей хеширования »(см. Https://msdn.microsoft.com/en-us/library/system.object.gethashcode (v = vs.110) .aspx) –

+2

Для GetHashCode() не требуется «шифровать» значение. Если, например, K является * int *, то да, вы получите то же значение обратно. Идеальный хэш, очень желательно. –

ответ

1

Перед вызовом GetHashCode() не существует «специальной инициализации». Как писал Ханс, GetHashCode() из Int32 вернет сам int (see this answer).

По умолчанию реализация GetHashCode() не гарантирует уникальность. Чтобы уменьшить конфликт кодов хэша, вам необходимо перезаписать метод. Существует популярное общее предложение для GetHashCode() здесь: What is the best algorithm for an overridden System.Object.GetHashCode?