如果两个不同的对象具有相同的哈希码,是否可能?这是否意味着它们相同?
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!
我预计 ctrl1
和 ctrl2
是具有不同 hashCode
的不同对象,但它们具有相同的 hashCode
。为什么?我如何确定 ctrl12
不是指向 ctrl2
的指针?
可以有两个具有相同哈希码的对象。
这是一个例子:
void main() {
print(1.hashCode); // 1
print(''.hashCode); // 1
}
1
和 ''
显然是两个不同的对象,但具有相同的哈希码。
事实上,所有对象都可以具有相同的散列码,它不应该对项目的行为(性能除外)产生影响。
不要使用哈希码来比较对象。
一个“Hashcode”是一个定义。你决定你的对象有什么哈希码。哈希码不应该用于查明两个对象是否实际上是同一个内存实例。
显然两个不同的对象可以具有相同的哈希码:
int i = 5;
int x = 5;
他们应该有相同的哈希码,毕竟他们是相同的值。它仍然是两个不同的变量。
哈希码也没有说明两个对象是否相等。它所做的唯一声明是具有不同哈希码的两个对象不相等。具有相同哈希码的两个对象在您检查它们是否相等之前是不相等的。他们可能相等。哈希码是一种减少必须进行的实际相等性检查次数的方法,而不是确定某物是否真的相等的方法。
我有一个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!
我预计 ctrl1
和 ctrl2
是具有不同 hashCode
的不同对象,但它们具有相同的 hashCode
。为什么?我如何确定 ctrl12
不是指向 ctrl2
的指针?
可以有两个具有相同哈希码的对象。
这是一个例子:
void main() {
print(1.hashCode); // 1
print(''.hashCode); // 1
}
1
和 ''
显然是两个不同的对象,但具有相同的哈希码。
事实上,所有对象都可以具有相同的散列码,它不应该对项目的行为(性能除外)产生影响。 不要使用哈希码来比较对象。
一个“Hashcode”是一个定义。你决定你的对象有什么哈希码。哈希码不应该用于查明两个对象是否实际上是同一个内存实例。
显然两个不同的对象可以具有相同的哈希码:
int i = 5;
int x = 5;
他们应该有相同的哈希码,毕竟他们是相同的值。它仍然是两个不同的变量。
哈希码也没有说明两个对象是否相等。它所做的唯一声明是具有不同哈希码的两个对象不相等。具有相同哈希码的两个对象在您检查它们是否相等之前是不相等的。他们可能相等。哈希码是一种减少必须进行的实际相等性检查次数的方法,而不是确定某物是否真的相等的方法。