我的直接项目是开发一个CheckSum系统,用于证明两个有些复杂的对象(功能上)是EQUAL - 在某种意义上它们具有相同的关键属性值。 (已经发现日期/时间不能包含在内,所以不能在更大的对象上使用JSON - duh :)(为了我的目的))。
为此,调用所选字符串上的hashCode()方法似乎是要走的路。
实现这一点后,我注意到在实践中,我在功能上“相同”的多个最高级别对象的运行中获得了非常不同的值。
有很多“nums”我没有圆润,有整数,bools,Strings等等。
我'总是'认为同一组值上的hashCode会返回相同的数字,我错过了什么?
BTW我在hashCode()上找到的唯一上下文是WebSockets。
当然我可以将自己的String编写为唯一值,但我想了解这是否是Dart或其他问题。
谢谢!
_swarmii
答案 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将返回相同的数字,我是否遗漏了某些东西?