18

私は、NSSet がハッシュを使用して潜在的な一致を検索し、それらのそれぞれで isEqual を呼び出して実際の衝突をチェックするという仮定の下で作業してきましたが、これを裏付ける証拠が見つからないことに気付きました。

取り上げる理由は、NSSet に「member:」メソッドが存在するためです。member: のドキュメントが、NSSet で他に何も行わないのに、isEqual: を使用してオブジェクトを検索することを指定するのはなぜですか? containsObject: はハッシュか何かのみを使用しますか?

誰でもこの動作を確認できますか? そして理想的には、そのドキュメントを参照してください。

4

2 に答える 2

19

Collections Programming Topics、特に「Sets: Unordered Collections of Objects」セクションを読むことをお勧めします。そこには、次の情報があります。

このパフォーマンス情報は、オブジェクトに対して定義されたハッシュ メソッドが適切に実装されていることを前提としています。ハッシュ関数が悪いと、アクセスと編集に直線的な時間がかかります。

セット内のオブジェクトは、NSObject プロトコル メソッド hash および isEqual: に応答する必要があります (詳細については、NSObject を参照してください)。変更可能なオブジェクトがセットに格納されている場合、オブジェクトのハッシュ メソッドが変更可能なオブジェクトの内部状態に依存してはならず、変更可能なオブジェクトがセット内にある間は変更されるべきではありません。たとえば、変更可能な辞書をセットに入れることはできますが、そこにある間は変更してはなりません。(特定のオブジェクトがコレクション内にあるかどうかを知るのは難しい場合があることに注意してください)。

はい、想定どおりにhashisEqualが使用されます。

于 2011-03-02T01:43:38.500 に答える