0

私の当面のプロジェクトは、2 つのやや複雑なオブジェクトが (機能的に) 等しいことを証明するためのチェックサムのシステムを開発することです。つまり、重要なプロパティの値が同じであるという意味です。(日付/時刻を含めることができないため、より大きなオブジェクトでJSONを使用できないことがわかりました-当然:)(私の目的のために))。

これを行うにはhashCode()、選択した文字列でメソッドを呼び出すのが最善の方法のようです。

これを実装すると、実際には、機能的に「同一」である最高レベルのオブジェクトの複数の実行で非常に異なる値が得られることに注意してください。

丸めていない「数値」がいくつかあります。整数、ブール値、文字列などがあります。

同じ値のセットの hashCode は同じ数値を返すと「常に」考えていましたが、何か不足していますか?

ところで、私が資料を見つけた唯一のコンテキストはhashCode()、WebSockets に関するものです。

もちろん、独自の文字列を一意の値に書き込むことはできますが、これが Dart の問題なのか、それとも何か他の問題なのかを理解したいと考えています。

4

3 に答える 3

3

「hashCode() メソッドの呼び出しは、等しい (==) オブジェクトに対して異なる値を返すことができますか?」というタイトルの質問に答えることができます。

簡単な答え: 2 つのオブジェクトが等しい (==) 場合、2 つのオブジェクトのハッシュ コードは同じでなければなりません。

オーバーライドhashCodeする場合は、 もオーバーライドする必要がありますequals。で定義されているように、等しい 2 つのオブジェクト==は、同じハッシュ コードも持つ必要があります。

ただし、ハッシュ コードは一意である必要はありません。つまり、完全に有効なハッシュ コードは value1です。ただし、優れたハッシュコードは均一に分散されている必要があります。

Objectのドキュメントから:

等値演算子 == を使用して比較したときに等しいオブジェクトのハッシュ コードは同じであることが保証されます。それ以外には、ハッシュ コードに関する保証はありません。それらは実行間で一貫性がなく、配布の保証はありません。

サブクラスが hashCode をオーバーライドする場合、一貫性を維持するために等値演算子もオーバーライドする必要があります。

于 2013-01-29T05:16:47.433 に答える
0

すぐに問題が見つかりました。オブジェクト stringify() メソッドは、あるレベルでは呼び出されませんでしたが、すべてのオブジェクトに存在する必要があるいくつかの stringify プロパティ (?) が呼び出されました。

これを修正すると、すべてが期待どおりに機能し、統計調査を複数回実行すると、最高レベル (階層の約 5 レベルに基づく) でまったく同じチェックサムが返されます。

一方、JSON.stringify は失敗し続けています。最も基本的なオブジェクトでも。失敗の原因を特定できませんでした。もちろん、問題は「文字列化」がどのように達成されるかではありません。

したがって、少なくとも経験的には、「等しいプロパティを持つオブジェクト」が Dart で等しい checkSums を返すことは事実だと思います。数値を四捨五入することが決定されました。これが問題を引き起こしているかどうかはわかりません - 知っておくとよいでしょうか? そしてもちろん、日付や時刻など、正当に変更される可能性があるものには注意してください。

_swarmii

于 2013-01-27T08:12:54.933 に答える