Почему мы можем предоставить Comparator для TreeSet, а не что-то вроде Hasher для HashSet? - PullRequest
2 голосов
/ 14 декабря 2010

В Java 6 мое понимание состоит в том, что вы можете предоставить компаратор для TreeSet при его создании, чтобы переопределить "естественное упорядочение" объектов в наборе.

Есть ли у вас какие-либо мысли, почему Java нене поддерживает поставку "Hasher", который также отменяет "естественное хеширование" объектов в наборе?

РЕДАКТИРОВАТЬ: получение информации от вас может помочь мне при разработке API в будущем.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 14 декабря 2010

Вот несколько вероятных причин:

  • Простота - большинству людей не нужны множественные хеш-функции, поэтому для простоты API имеет смысл полагаться нав одном подходе Object.hashCode ()

  • Производительность - По крайней мере, в стандартной библиотеке HashSets, HashMaps и т. д. должны быть довольно сильно оптимизированы, поскольку онитак широко используется.Не имеет смысла накладывать издержки на вызов отдельного «хэша», каким бы небольшим он ни был.

  • Личные поля - проблема естьчто hashCode () может опираться на приватные поля, может быть сложно создать внешние «хэши» для некоторых объектов.

2 голосов
/ 14 декабря 2010

Объект Hasher будет избыточным для метода hashCode() в классе Object.

Если вы хотите повлиять на характер хеширования, вы должны переопределитьметод hashCode(), определенный для Object.Просто обязательно переопределите также equals(Object), поскольку эти два всегда должны идти вместе.

A HashSet или другая подобная структура данных будет использовать метод objects hashCode(), чтобы получить значение хеша для определения binместо хранения.Затем он будет использовать equals() для сравнения этого объекта с другими объектами в той же корзине для определения равенства.

Сгенерированный хеш-код должен быть уникальным для этого конкретного класса объектов.Это может быть обеспечено простым переопределением метода hashCode() и не требует перехода от реализации к реализации.Объект Hasher просто запутывает и не служит никакой дополнительной цели.Я не мог придумать ни одного случая использования, когда для хранения в разных структурах данных потребовалось бы несколько хеш-кодов.

1 голос
/ 14 декабря 2010
1 голос
/ 14 декабря 2010

Да!Проверьте метод Object.hashCode .

После прочтения вашего вопроса я, возможно, бросил пистолет.Теперь я вижу, что вы сказали «переопределить» естественный хшинг.Обычно мы переопределяем значение хеша на уровне объекта и отказываемся от использования переопределяющего хэша.

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

0 голосов
/ 14 декабря 2010

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

cf Trove4j поддерживает стратегии хеширования для своей HashMap, и хотя я часто использую эту библиотеку, я использовал толькопользовательскую стратегию хеширования, которую я помню.

...