2013-08-08 2 views
1

я следующий класс:GetHashCode для аналогичных значений

public class Foo 
{ 
    int year;  
    string name;  
    int category; 
} 

Вот несколько примеров данных:

2012 Test1 1000 
2012 Test2 1000 
2012 Test3 1000  
2012 Test4 1000 
2012 Test4 10 
... 

Если я переопределить GetHashCode все результаты очень похож:

return year^name^category; 

int hash = 13; 
    hash = hash * 33 + year.GetHashCode(); 
    hash = hash * 33 + name.GetHashCode(); 
    hash = hash * 33 + category.GetHashCode(); 
    return hash; 

Что такое хорошая хэш-функция (с максимальным распределением) для этой ситуации?

Редактировать: Возможно, мое понимание хэш-ковшей ошибочно. Переместить похожие значения хэша в одно и то же ведро?

"Test1".GetHashCode() --> -1556460260 
"Test2".GetHashCode() --> -1556460257 
+2

Хотя что реализация 'GetHashCode' может быть улучшаемой, я бы сказал, что это нормально для хэша-кода быть похожей, так как объекты похожи, тоже! Вы, конечно, не можете вычесть плохое распределение из этого –

+0

Почему 33? Я думаю, что общий выбор - это простое число (чего нет 33), хотя я не могу точно сказать, почему. – Dukeling

+0

Почему вы заинтересованы в результатах, похожих на похожие? Чего вы действительно пытаетесь достичь? –

ответ

2

Одна из вещей, которые я бы рекомендовал, чтобы проверить, если объект Строка является нулевым или нет.

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

public int hashCode() { // Assuming year and category are String like name. 
    int hash = 31; 
    hash = hash * 331 + (this.year != null ? this.year.GethashCode() : 0); 
    hash = hash * 331 + (this.name != null ? this.name.GethashCode() : 0); 
    hash = hash * 331 + (this.category != null ? this.category.GethashCode() : 0); 

    return hash; 
} 

несколько шагов, которые я узнал в то время как главенствующий является хэш-код;

  1. Выберите простое хэш например, 5, 7, 17 или 31 (простое число как хеш, приводит к четкому хэш-коду для отдельного объекта).
  2. Возьмите еще один премьер, как множитель, отличный от хеша.
  3. Вычислить hashcode для каждого члена и добавить их в конечный хеш. Повторите это для всех членов, которые участвовали в равных.
  4. Возврат хэша.
+1

Ни «год», ни «категория» в классе OP не имеют значения NULL, поэтому ваш код не сможет скомпилировать его. –

+0

@ JesseC.Slicer Спасибо за это. Я принимал год и категорию как String. благодаря – JNL

Смежные вопросы