在Dart中,hashCode()方法调用在相等(==)对象上返回不同的值吗?

时间:2013-01-27 03:34:18

标签: dart hashcode checksum

我的直接项目是开发一个CheckSum系统,用于证明两个有些复杂的对象(功能上)是EQUAL - 在某种意义上它们具有相同的关键属性值。 (已经发现日期/时间不能包含在内,所以不能在更大的对象上使用JSON - duh :)(为了我的目的))。

为此,调用所选字符串上的hashCode()方法似乎是要走的路。

实现这一点后,我注意到在实践中,我在功能上“相同”的多个最高级别对象的运行中获得了非常不同的值。

有很多“nums”我没有圆润,有整数,bools,Strings等等。

我'总是'认为同一组值上的hashCode会返回相同的数字,我错过了什么?

BTW我在hashCode()上找到的唯一上下文是WebSockets。

当然我可以将自己的String编写为唯一值,但我想了解这是否是Dart或其他问题。

谢谢!

_swarmii

3 个答案:

答案 0 :(得分:3)

我可以尝试回答标题中提出的问题:“hashCode()方法调用可以在相等(==)对象上返回不同的值吗?”

简短回答:如果这两个对象等于(==),则两个对象的哈希码必须相同。

如果您覆盖hashCode,则还必须覆盖equals。由==定义的两个相等的对象也必须具有相同的哈希码。

但是,哈希码不必是唯一的。也就是说,完全有效的哈希码是值1。但是,良好的哈希码应该是均匀分布的。

来自Object的文档:

  

对于相同的对象,保证散列码相同   当使用等于运算符==进行比较时。除此之外   不保证哈希码。它们不一致   在运行之间并没有分配保证。

     

如果子类重写hashCode,它应该覆盖相等性   操作员也要保持一致性。

答案 1 :(得分:0)

我发现了眼前的问题。对象stringify()方法在一个级别上没有被调用,而是一些必须存在于所有对象中的stringify属性(?)。

通过这个修复,一切都按照我的预期运行,并且我们的统计研究的多次运行在最高级别返回完全相同的CheckSum(基于5个级别的层次结构)。

同时JSON.stringify仍然失败。即使在最基本的对象中。我无法确定导致失败的原因。当然,问题不在于如何完成“字符串化”。

所以,至少在经验上,我相信“具有相同属性的对象”将在Dart中返回相同的checkSums。决定围绕nums,我不知道这是否会导致问题 - 或许很好意识到?当然,记住要注意日期,时间或任何可以合法变化的事情。

_swarmii

答案 2 :(得分:0)

Seth Ladd链接的文档现在包含信息:

  

它们不必在同一程序的执行之间保持一致,也没有分发保证。”

从技术上讲,hashCode的值可以用相同的对象在不同的​​执行方式中更改,以解决您的问题:

  

我一直认为,在同一组值上的hashCode将返回相同的数字,我是否遗漏了某些东西?