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

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

class A {
  private List<Object> list;
}

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

Ответы [ 5 ]

13 голосов
/ 16 июня 2010

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

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

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

( Список документации )

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

2 голосов
/ 16 июня 2010

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

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

1 голос
/ 06 февраля 2017

Любая конкретная причина, по которой вы просто не сделаете:

Arrays.hashCode(<cast list to array>);

Что-то вроде:

Arrays.hashCode((String []) myList.toArray());
0 голосов
/ 16 июня 2010

В библиотеке 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 голосов
/ 16 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...