Ваш вопрос немного неясен, какие поля вам нужны/достаточны, чтобы однозначно различать ключ.
Как правило, вы должны комбинировать отдельные хеши (в составном ключе) путем умножения на простые коэффициенты.
Предполагая, первый пример:
public int hashCode() {
int h = className.hashCode() * 23;
h += methodName.hashCode() * 17;
h += uniqueNumber;
return h;
}
Ото, если uniqueNumber
на самом деле уникальный, можно упростить:
public int hashCode() {return uniqueNumber;}
В вашем комментарии вы упомянули одну вещь: «Использование только uniqueNumber будет генерировать уникальный хэш, но я потеряю способность ссылаться на определенные значения в моем хэшмапе ».
Теперь это очень важно: «Идентификация экземпляра» - это совсем другая вещь для хеша на & lookup, от «Value»! Вы не можете использовать тот же хэш-код & карты для обоих.
Например, если вам нужен ключ (ИмяКласс, MethodName) -> SomeValue поиск, что бы «значение» поиск & нужен будет хэширование по ИмяКлассу & значений имяМетода так, что он может быть повторен: то есть, так вы можете создать ключ для Map.get() для выполнения поиска.
«Идентификация экземпляра» на самом деле имеет встроенную поддержку для хэширования & карт на Java - это называется IdentityHashMap.
Но в большинстве случаев, в том числе & особенно составных ключей которые предположительно будет использоваться для карты, ключевые потребности, чтобы иметь возможность быть реконструировано позже выполнить поиск. Таким образом, ключ должен иметь значение семантики, и сомнительно, должен ли ваш uniqueNumber
быть частью ключа.
Когда вы переходите к поиску позже, как вы получите правильный uniqueNumber
для извлечения данных? У меня такое ощущение, что:
Либо должен быть первый класс объект там вместо этого, который можно использовать в качестве ключа непосредственно (так не требуется класс CompositeKey больше), или что
Вы не может повторно получить uniqueNumber
, и в этом случае он не работает/не требуется в любом случае.
Резюмируя: если uniqueNumber
действительно необходимо или это применимо вообще, я бы ожидать, что она уже воплощен в первый класс объекта. Это не так. Похоже, вы, вероятно, должны использовать ключ на основе значений и сбросить бит uniqueNumber (отсюда как минимум).
Так что моя рекомендация:
public int hashCode() {
int h = className.hashCode() * 23;
h += methodName.hashCode() * 17;
h += desc.hashCode();
return h;
}
Позвольте мне знать, если это помогает.
Я считаю, что существует много подобных вопросов на SO .... –
Если вы хотите гарантировать отсутствие столкновений, 'return uniqueNumber;' –
uniqueNumber - это последовательно увеличивающееся число, значения которого у меня нет прямого управления. Использование только uniqueNumber будет генерировать уникальное значение хэша, но я потеряю способность ссылаться на определенные значения в моем hashmap – HXSP1947