0

我当前的项目是开发一个校验和系统,以证明两个有些复杂的对象(功能上)相等——从某种意义上说,它们的关键属性具有相同的值。(发现不能包含日期/时间,所以不能在更大的对象上使用 JSON - 呃 :) (出于我的目的))。

要做到这一点,在选定的字符串上调用hashCode()方法似乎是要走的路。

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

有许多“数字”我没有四舍五入,有整数、布尔值、字符串等等。

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

顺便说一句,我发现材料的唯一上下文是hashCode()WebSockets。

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

4

3 回答 3

3

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

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

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

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

来自Object的文档:

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

如果子类覆盖 hashCode 它也应该覆盖相等运算符以保持一致性。

于 2013-01-29T05:16:47.433 回答
0

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

有了这个修复,一切都按照我的预期工作,我们的统计研究的多次运行在最高级别(基于大约 5 个层次结构)返回完全相同的校验和。

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

所以,至少从经验上看,我相信“具有相同属性的对象”在 Dart 中返回相等的 checkSums 是真的。决定对数字进行舍入,我不知道这是否会导致问题 - 也许需要注意?当然,请记住要提防日期、时间或任何可能合法变化的东西。

_swarmii

于 2013-01-27T08:12:54.933 回答
0

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

它们不需要在同一程序的执行之间保持一致,并且没有分发保证。`

因此,对于您的问题,技术上hashCode的价值可以在不同的执行中随着相同的对象而改变:

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

于 2019-07-27T02:35:30.323 回答