Эффективный хэш-код для мультисетов на Java

Я определил подинтерфейс java.util.Collection, который фактически является мультисетным (так называемый мешок). Она может не содержать null элементов, хотя это и не имеет решающего значения для моего вопроса. Равноценный договор, определенный интерфейсом, как и следовало ожидать:

  • obj instanceof MyInterface
  • obj содержит те же элементы, что и this (по equals)
  • obj содержит одинаковое количество дубликатов для каждого элемента
  • порядок элементов не принимается во внимание

Теперь я хочу написать свой метод hashCode. Моей первоначальной идеей было:

int hashCode = 1;
for( Object o : this ) {
    hashCode += o.hashCode();
}

Однако, я заметил, что com.google.common.collect.coltiset (из Guava) определяет хэш-код следующим образом:

int hashCode = 0;
for( Object o : elementSet() ) {
    hashCode += ((o == null) ? 0 : o.hashCode()) ^ count(o);
}

Мне кажется странным, что пустой Multiset будет иметь хэш-код 0, но, что более важно, я не понимаю преимущества ^ count(o) по сравнению с простым сложением хэш-кодов каждого дубликата. Может быть, речь идет о том, чтобы не вычислять один и тот же хэш-код более одного раза, но тогда почему бы не * count(o)?

Мой вопрос: что было бы эффективным вычислением хэш-кода? В моем случае счет для элемента не гарантированно будет дешевым.

8
задан ColinD 16 September 2011 в 00:36
поделиться