2011-03-02 4 views
15

मैं इस धारणा के तहत काम कर रहा हूं कि एनएसएसएटी ने संभावित मैचों को देखने के लिए हैश का इस्तेमाल किया था, और फिर वास्तविक टक्कर की जांच करने के लिए उनमें से प्रत्येक पर isEqual कहा जाता था, लेकिन मुझे एहसास हुआ कि मुझे इसे वापस करने के लिए कोई सबूत नहीं मिल रहा है।क्या एनएसएससेट विशिष्टता को परिभाषित करने के लिए हैश का उपयोग करता है?

कारण मैं इसे लाने का कारण एनएसएससेट में "सदस्य:" विधि का अस्तित्व है। सदस्य के लिए प्रलेखन क्यों है: यह निर्दिष्ट करने के लिए अपने रास्ते से बाहर निकलें कि एक्सेल: आपकी ऑब्जेक्ट को खोजने के लिए उपयोग किया जाता है जब एनएसएसएटी में कुछ और नहीं होता है? क्या ऑब्जेक्ट है: केवल हैश या कुछ का उपयोग करें?

क्या कोई इस व्यवहार की पुष्टि कर सकता है? और आदर्श, संदर्भ दस्तावेज इस पर?

उत्तर

17

मैं Collections Programming Topics पढ़ने का सुझाव दूंगा, विशेष रूप से 'सेट्स: ऑब्जेक्ट्स ऑफ ऑब्जेक्ट्स' सेक्शन। वहाँ में आप निम्नलिखित जानकारी मिल जाएगी:

इस प्रदर्शन जानकारी हैश विधि वस्तुओं के लिए परिभाषित के लिए पर्याप्त कार्यान्वयन मान लिया गया है। खराब हैश फ़ंक्शन, एक्सेस और संपादन रैखिक समय लेते हैं। (अधिक जानकारी के लिए NSObject देखें):

और

एक सेट में वस्तुओं NSObject प्रोटोकॉल तरीकों हैश और isEqual का जवाब देना होगा। परिवर्तनशील वस्तुओं एक सेट में जमा हो जाती है, या तो वस्तुओं की हैश विधि परिवर्तनशील वस्तुओं या परिवर्तनशील वस्तुओं की आंतरिक स्थिति पर निर्भर नहीं रहना चाहिए तो संशोधित नहीं किया जाना चाहिए वे सेट में हैं, जबकि । उदाहरण के लिए, एक म्यूटेबल शब्दकोश को सेट में रखा जा सकता है, लेकिन आपको में होने पर इसे बदलना नहीं चाहिए। (ध्यान दें कि किसी दिए गए ऑब्जेक्ट संग्रह में है या नहीं, यह जानने के लिए मुश्किल हो सकता है)।

तो, हाँ, hash और isEqual का उपयोग किया गया था जैसा आपने माना था।

+1

मुझे यह उल्लेख करना चाहिए था कि मैंने इसे पढ़ा है, साथ ही संबंधित एनएसएसएटी दस्तावेज भी पढ़ा है। यदि आप वास्तव में इसे पढ़ते हैं, तो आप देखेंगे कि यह "IsEqual" का उपयोग करने के बारे में कुछ भी नहीं कहता है, केवल उन्हीं वस्तुओं को इसे लागू करना होगा। चूंकि आपको लागू करने की आवश्यकता है इक्वल्स: यदि आप हैश को लागू करते हैं, तो वही सलाह लागू होगी, भले ही सभी एनएसएससेट वास्तव में हैश था। दिलचस्प बात यह है कि वे केवल हैश और उत्परिवर्तन के खिलाफ चेतावनी देते हैं। अगर वे इक्वेल का इस्तेमाल करते हैं, तो कोई सोचता है कि वही चेतावनी वहां लागू होगी। – DougW

12

मैं एनएससेट के hash और isEqual: के उपयोग के बारे में और जानकारी देना चाहता हूं, क्योंकि मुझे हाल ही में अजीब बग का सामना करना पड़ा है और पाया है कि वे hash को देखकर मेरे कारण थे।

जब आप एक सेट में कस्टम वस्तुओं की दुकान, NSSet जिसमें वे एक-दूसरे को अपने-अपने isEqual: विधि का उपयोग कर रहे हैं की तुलना में मूल्य अलग डिब्बे में समूह ऑब्जेक्ट में अपने hash विधि से लौट आए, का उपयोग करता है। तो मूल रूप से, hash हमेशा आपके ऑब्जेक्ट पर कॉलिंग, बिल्डिंग, सदस्यता का परीक्षण करते समय बुलाया जाएगा, और यदि यह ऑब्जेक्ट एक बिन में आता है जहां अन्य ऑब्जेक्ट्स हैं, तो इसकी isEqual विधि का उपयोग उनसे अलग करने के लिए किया जाएगा।

यही कारण है कि hashहमेशा समान वस्तुओं के बराबर होना चाहिए, और जितना संभव हो सके, उपज मूल्य उत्पन्न करें जो वस्तुओं को समान रूप से फैलाएंगे। बाद की संपत्ति सुनिश्चित करता है कि डिब्बे जितना संभव हो उतना छोटा हो, isEqual: पर कॉल को कम करें।

+0

बहुत उपयोगी अंतर्दृष्टि। धन्यवाद। :) – Tiago

+0

यह कहने के लिए धन्यवाद कि दस्तावेज क्या नहीं कहता – felipeek

+0

यहां डिब्बे क्या हैं? – BangOperator

संबंधित मुद्दे

 संबंधित मुद्दे