felangel / equatable

A Dart package that helps to implement value based equality without needing to explicitly override == and hashCode.
https://pub.dev/packages/equatable
MIT License
901 stars 100 forks source link

Equality and Hashcode differ for Sets with different order #141

Closed devmil closed 1 year ago

devmil commented 1 year ago

Describe the bug For properties of type Set the result of hashCode is unexpected. Equality works like expected (order of Set elements doesn't have an impact) but hashCode produces different values depending on the order in the Set.

To Reproduce Steps to reproduce the behavior:

import 'package:equatable/equatable.dart';

class EquatableWithSet extends Equatable {
  final Set<int> intSet;

  EquatableWithSet(this.intSet);

  @override
  List<Object?> get props => [
        intSet,
      ];
}

void main(List<String> arguments) {
  final obj1 = EquatableWithSet({1,2,3});
  final obj2 = EquatableWithSet({3,1,2});

  assert(obj1 == obj2, 'Are not equal!');
  assert(obj1.hashCode == obj2.hashCode, 'Don\'t have the same hashcode!');
}

Expected behavior Two objects that are equal also have the same hashCode (independent of the order in the Set)

Screenshots If applicable, add screenshots to help explain your problem.

Version Dart SDK version: 2.17.5 (stable) (Tue Jun 21 11:05:10 2022 +0200) on "macos_x64"

Additional context Add any other context about the problem here.