什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
我正在编写一个需要基于其两个字段的唯一哈希码的类,我想知道对 2 个字段哈希码进行异或是否足以为我的对象生成唯一且一致的哈希码?
class _TypeMatch{
final Type _potentialSubtype;
final Type _supertype;
int _cachedHashCode;
_TypeMatch(this._potentialSubtype, this._supertype){
_cachedHashCode = _potentialSubtype.hashCode ^ _supertype.hashCode;
}
int get hashCode => _cachedHashCode;
bool operator ==(other){
return other is _TypeMatch && _cachedHashCode == other._cachedHashCode;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里看到了这个问题,它似乎表明对另外两个哈希码进行异或是正确的做法,但它们首先将每个哈希码乘以 2 个大素数,我不确定为什么或是否有必要这样做。我主要关心的是对于两种类型 A 和 B:
new _TypeMatch(A, B) == new _TypeMatch(A, B) // is true for all A and B
Run Code Online (Sandbox Code Playgroud)
并且组合散列的计算尽可能高效,因为创建新的 _TypeMatch 将成为系统的核心部分,因此在整个系统中会明显感觉到任何性能低效。
哈希码用于例如哈希映射或哈希表,以将存储的键/值平均分配到“槽”中。一个槽可以包含许多键/值,但通过使用哈希码,可以轻松快捷地在映射中找到一个槽,并从那里在更小的一组值中查找具体的键/值。无论键使用哪种数据类型,这都可以非常快速地提高在地图中搜索的速度。当哈希码为存储的键/值更改时,无法再通过键检索该值。你可以用1作为每个对象的哈希码,但这会破坏性能。您会通过良好的分布(不同对象的不同哈希码)获得相反的效果(最佳性能),但存在限制。例如,当您使用 32 位整数类型作为哈希码时,可能的哈希码数量是有限的。有关更多详细信息,请参阅http://en.wikipedia.org/wiki/Hash_table。不过,散列还有更多用例。
我试图测试这个功能
UserApi createUserApi(String url, String username, String password) {
UserApi userApi = new UserApi(base: route(url), serializers: repo);
userApi.base.basicAuth('$username', '$password');
return userApi;
}
Run Code Online (Sandbox Code Playgroud)
基本上,测试是将这个函数的结果与它的“手动组合”进行比较,期望得到相同的结果。但它没有:
String username = "asd";
String password = "asd";
UserApi userApiTest = new UserApi(base: route("asd"), serializers: repo);
userApiTest.base.basicAuth('$username', '$password');
test("UserApi creation", () {
UserApi userApi = _presenter.createUserApi("asd", "asd", "asd");
expect(userApi, userApiTest);
});
Run Code Online (Sandbox Code Playgroud)
结果总是:
Expected: <Instance of 'UserApi'>
Actual: <Instance of 'UserApi'>
Run Code Online (Sandbox Code Playgroud)
他们为什么不同?在调试中,每个属性都是相同的。
我只是在 Dart 中塞了一堆MyClass东西Set。MyClass没有实现Comparable,也没有==定义运算符。它编译得很好。
为了Set正确检测重复项,我是否必须实现Comparable接口,或者只是覆盖==运算符?
dart ×3
flutter ×2
hashcode ×2
comparison ×1
equals ×1
java ×1
overriding ×1
set ×1
testing ×1
unit-testing ×1