Scala Set Hashcode - PullRequest
       11

Scala Set Hashcode

1 голос
/ 12 октября 2011

Предположим, у нас есть три набора строк в Scala.У каждого есть элементы A, B, C.Два имеет элементы B, C, D.И Три имеет элементы J, K, I.

Мой первый вопрос: есть ли способ, что хеш-коды для любых двух из этих наборов могут быть одинаковыми?Мой второй вопрос: если я добавлю D в One и A в два, чтобы получить новые наборы One.n и Two.n, одинаковые ли хэш-коды для One.n и Two.n?

Ответы [ 2 ]

6 голосов
/ 12 октября 2011

Вопрос 1) В общем, да, вполне возможно.Хеш-код имеет ограниченное количество байтов.Набор может быть любого размера.Таким образом, хэш-коды не могут быть уникальными (хотя, как правило, они есть).

Вопрос 2) Почему бы не попробовать это?метод == должен быть верным для этих двух экземпляров.

2 голосов
/ 12 октября 2011

Наборы, которые равны и в них нет ничего странного (т. Е. Что-либо с нестабильным хеш-кодом или где хеш-код несовместим с равными), должны иметь равные хеш-коды.Если это не так, и наборы относятся к одному и тому же типу набора , это ошибка, о которой следует сообщить.Если наборы являются различными типами наборов, может быть или не быть ошибкой иметь разные хеш-коды (но в любом случае это должно совпадать с равными).Однако я не знаю ни одного случая, когда реализации различных наборов не были бы равными (например, даже изменяемый BitSet соглашался с неизменным Set). гарантированно должен быть уникальным, но он должен быть хорошо распределен, так как вероятность коллизий должна быть низкой

hashCode наборов должен всегда соответствовать равным (при условии, что все, что вы положили в наборхэш-код соответствует (равно) в том, что равные наборы имеют равные хэш-коды.(Обратное неверно из-за пункта (1).) Устанавливает заботу только об идентичности содержимого, а не о порядке добавления к набору (это смысл иметь набор вместо, скажем,, список)
...