Как правильно определить хеш-функцию для списка объектов?

У меня есть структура данных, содержащая список объектов, как это:

class A {
  private List<Object> list;
}

Как правильно определить хеш-функцию для списка, предположив, что каждый элемент списка имеет корректное hashCode()?

5
задан Wouter 11 January 2017 в 10:32
поделиться

4 ответа

Если фактическая реализация List полностью соответствует интерфейсу, предоставленной реализации hashCode должно быть достаточно:

Возвращает значение хэш-кода для этого списка. Хэш-код списка определяется как результат следующих вычислений:

hashCode = 1;
  Iterator i = list.iterator();
  while (i.hasNext()) {
      Object obj = i.next();
      hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
  }

( Документация по списку )

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

13
ответ дан 18 December 2019 в 10:42
поделиться

Почему вы хотите определить hashCode для вашего списка, когда он уже реализовал (вместе с равно )?

(При условии, что это java.util.List , но если нет, то ссылка выше показывает вам точную реализацию, которую вы можете использовать для своего типа списка.)

2
ответ дан 18 December 2019 в 10:42
поделиться

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

0
ответ дан 18 December 2019 в 10:42
поделиться

В библиотеке Java реализации List ( LinkedList , ArrayList ) используют реализацию по умолчанию hashCode , предоставленную AbstractList . который определяется как:

int hashCode = 1;
Iterator<E> i = iterator();
while (i.hasNext()) {
    E obj = i.next();
    hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
}
return hashCode;
0
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: