Dart 2.14.4类型相等性异常:不同Type实例hashCode相同
Dart类型hashCode碰撞问题解答
这个现象不是Dart的bug,属于对hashCode契约的认知偏差,以及旧版本Dart Type类型hashCode实现的性能优化不足导致的问题。
- 首先明确哈希码的通用契约:
所有编程语言的哈希码设计都遵循同一套基础规则:如果两个对象通过
==判断相等,那么它们的hashCode必须相等;但反过来两个==不相等的对象,不强制要求hashCode不同。
两个不等对象出现相同hashCode的情况叫做「哈希碰撞」,属于哈希机制的正常现象,只会影响哈希集合(比如HashMap、HashSet)的查询性能,不属于功能错误。
- 旧版本Dart的Type类型实现问题:
你使用的Dart 2.14.4属于较早的版本,当时Type类的hashCode实现逻辑比较简单,不同内置类型、可空和非可空类型之间出现哈希碰撞的概率较高,你遇到的就是double和String?两个类型刚好出现了哈希碰撞的情况。这个优化问题在Dart 2.18及之后的版本已经得到改进,类型hashCode的碰撞概率大幅降低,但依然不能保证所有不等类型的hashCode完全不同。 - 正确的类型相等性判断方式:
永远不要通过hashCode是否相等来反推两个对象是否相等,判断类型相等直接使用==运算符即可,你的测试代码中第一条断言expect(doubleType == nullableStringType, isFalse)的判断逻辑才是正确的。
内容的提问来源于stack exchange,提问作者J F
相关产品推荐
相关产品推荐

