Зависит от того, что вы подразумеваете под равенством. И поэтому вы, как разработчик классов, должны определить их равенство.
Иногда используется один случай, когда два экземпляра считаются «равными», если они указывают на одно и то же место в памяти, но это не всегда то, что вы хотите. Например, если у меня есть класс Person, я мог бы рассмотреть два объекта Person «равными», если они имеют одинаковые фамилию, имя и номер социального страхования (даже если они указывают на разные места в памяти).
С другой стороны, мы не можем просто сказать, что два объекта равны, если значение каждого из их членов одинаково, поскольку иногда вы этого не хотите. Другими словами, для каждого класса разработчик класса должен определить, какие члены составляют «идентичность» объектов и разработать правильный оператор равенства (будь то путем перегрузки оператора == или метода Equals).
Сказать, что два объекта равны, если они имеют одинаковый хэш, - это единственный выход. Однако тогда вам нужно задаться вопросом, как вычисляется хеш для каждого экземпляра. Возвращаясь к приведенному выше примеру «Персона», мы могли бы использовать эту систему, если хэш рассчитывался путем просмотра значений полей «Имя», «Фамилия» и «Номер социального страхования». Кроме того, мы полагаемся на качество метода хеширования (сама по себе это огромная тема, но достаточно сказать, что не все хэши созданы равными, а неправильные методы хеширования могут привести к большему столкновений, которые в этом случае будут возвращать ложные совпадения).