如果两个不同的对象具有相同的哈希码,是否可能?这是否意味着它们相同?

Is it possible if two different objects have the same hashcode? Does it means they are the same?

我有一个class

class Controller with EquatableMixin {
  final int id;
  //... other props

  Controller.from(Controller controller) :   
    id = controller.id,
    //... other props assignments

  List<Object> props => [
    id,
    //... other props
  ];
}

final ctrl1 = Controller(...); // Create ctrl1
final ctrl2 = Controller.from(ctrl1); // Create ctrl2 (actually clonning)
assert(ctrl1.hasCode != ctrl2.hasCode); // triggered!

我预计 ctrl1ctrl2 是具有不同 hashCode 的不同对象,但它们具有相同的 hashCode。为什么?我如何确定 ctrl12 不是指向 ctrl2 的指针?

可以有两个具有相同哈希码的对象。

这是一个例子:

void main() {
  print(1.hashCode); // 1
  print(''.hashCode); // 1
}

1'' 显然是两个不同的对象,但具有相同的哈希码。

事实上,所有对象都可以具有相同的散列码,它不应该对项目的行为(性能除外)产生影响。 不要使用哈希码来比较对象。

一个“Hashcode”是一个定义。你决定你的对象有什么哈希码。哈希码不应该用于查明两个对象是否实际上是同一个内存实例。

显然两个不同的对象可以具有相同的哈希码:

int i = 5;
int x = 5;

他们应该有相同的哈希码,毕竟他们是相同的值。它仍然是两个不同的变量。


哈希码也没有说明两个对象是否相等。它所做的唯一声明是具有不同哈希码的两个对象相等。具有相同哈希码的两个对象在您检查它们是否相等之前是不相等的。他们可能相等。哈希码是一种减少必须进行的实际相等性检查次数的方法,而不是确定某物是否真的相等的方法。