2010-03-19 13 views
7

ओएलई वेरिएंट, जैसा कि विजुअल बेसिक के पुराने संस्करणों और COM ऑटोमेशन में व्यापक रूप से उपयोग किया जाता है, कई प्रकार के स्टोर स्टोर कर सकते हैं: पूर्ण प्रकार जैसे पूर्णांक और फ्लोट, स्ट्रिंग और सरणी जैसे अधिक जटिल प्रकार, और IDispatch कार्यान्वयन के सभी तरीके और ByRef रूपों के रूप में पॉइंटर्स।हैशिंग ओएलई वेरिएंट के लिए अनुशंसित कार्यान्वयन क्या है?

वेरिएंट भी कमजोर टाइप किए गए हैं: वे आपके द्वारा लागू किए जाने वाले ऑपरेटर के आधार पर मूल्य को दूसरे प्रकार में परिवर्तित करते हैं और ऑपरेटर को दिए गए मानों के वर्तमान प्रकार क्या हैं। उदाहरण के लिए, दो प्रकारों की तुलना, जिसमें एक पूर्णांक 1 होता है और दूसरा स्ट्रिंग "1" होता है, समानता के लिए True वापस आ जाएगा।

तो यह सोचते हैं कि मैं अंतर्निहित डेटा स्तर पर भिन्न रूपों के साथ काम कर रहा हूँ (सी में VARIANT जैसे ++ या डेल्फी में TVarData - अलग संभावित मानों की बड़ी संघ यानी), मैं कैसे हैश चाहिए लगातार वेरिएंट इतना है कि वे सही पालन नियम?

नियम:

  • विविधताएँ हैश असमान रूप में असमान की तुलना करनी चाहिए, दोनों छंटाई और प्रत्यक्ष समानता
  • प्रकार है कि दोनों छंटाई और प्रत्यक्ष समानता हैश चाहिए के रूप में बराबर
के लिए के रूप में बराबर की तुलना में

हैशिंग फिट बनाने के लिए मुझे अलग सॉर्टिंग और प्रत्यक्ष तुलना नियमों का उपयोग करना ठीक है।

जिस तरह से मैं वर्तमान में काम कर रहा हूं वह है कि मैं तारों (यदि वे फिट हैं) के रूप में वेरिएंट को सामान्य कर रहे हैं, और उन्हें स्ट्रिंग के रूप में व्यवहार कर रहे हैं, अन्यथा मैं संस्करण डेटा के साथ काम कर रहा हूं जैसे कि यह एक अपारदर्शी ब्लॉब था, और हैशिंग और कच्चे बाइट की तुलना। इसमें कुछ सीमाएं हैं, बेशक: संख्या 1..10[1, 10, 2, ... 9] आदि के रूप में क्रमबद्ध करें। यह हल्का कष्टप्रद है, लेकिन यह लगातार है और यह बहुत कम काम है। हालांकि, मुझे आश्चर्य है कि इस समस्या के लिए एक स्वीकार्य अभ्यास है या नहीं।

+1

वैरिएंट वास्तव में एक संरचना है, जिसमें डेटा के दो टुकड़े हैं - मूल्य और प्रकार। आपकी तुलना और रूपांतरण दावा केवल मूल्य को ध्यान में रखता है और उस संरचना के दायर प्रकार को नहीं देखता है। सही दृष्टिकोण हमेशा दायर प्रकार के बारे में भी विचार करना है। –

+1

@ फ्रांसी, मुझे लगता है कि आप इस बिंदु को चूक गए हैं। दो प्रकार भिन्न होते हैं जब भी उनके प्रकार भिन्न होते हैं। यदि वेरिएंट बराबर की तुलना करते हैं, तो बैरी अपने हैंश को समान मानना ​​चाहती है। 'संस्करण (1) = संस्करण ('1')' ==> 'हैश (संस्करण (1)) = हैश (संस्करण ('1'))'। –

+1

बैरी, मुझे नहीं लगता कि आपका पहला नियम सही है। यह हैश टकराव की संभावना को अनदेखा करता है, जहां हैश बराबर हैं लेकिन मान समान नहीं हैं। –

उत्तर

0

वैरिएंट्स के हैश कोड बराबर बराबर होना चाहिए।

समानता परीक्षण करने के लिए उपयोग की जाने वाली समानता और जबरन नियमों को जानने के बिना, उचित कार्यान्वयन के साथ आना मुश्किल है।

+0

मैं बेहद परिचित हूं कि हैश कोड कैसे काम करते हैं।नेट और जावा (मैंने दोनों सीएलआर और जेवीएम दोनों को लक्षित करने में कंपाइलर्स लिखे हैं), लेकिन समस्या यह है कि वीबी और डेल्फी में उपयोग किए जाने वाले वेरिएंट टाइप-सेफ नहीं हैं जैसे पॉलिमॉर्फिक ऑब्जेक्ट्स ऑब्जेक्ट इन ऑब्जेक्ट इन .NET या Java, या जिस तरह से रूबी, पायथन या जावास्क्रिप्ट में मान प्रकार सुरक्षित हैं। यही है, '1 ==" 1 "', या '1. एक्वाल्स (" 1 ") == सत्य', '1' और' "1" के वैरिएंट मानों के लिए। मुझे लगता है कि मेरे प्रश्न का उत्तर "यह निर्भर करता है" - भाषा अर्थशास्त्र के आधार पर। –

+0

मैं इस जवाब को चिह्नित कर रहा हूं क्योंकि यह सच है, हैश फ़ंक्शन को लिखने के लिए, समानता फ़ंक्शन से मेल खाने की गारंटी है, समानता फ़ंक्शन को ज्ञात और अच्छी तरह से परिभाषित किया जाना चाहिए। –

0

तो संक्षेप में, सामानों को तुलनीय बनाने के लिए आप पहले एक सामान्य प्रारूप, स्ट्रिंग या ब्लॉब पर स्ट्रीम करते हैं।

आप कैसे प्रबंधित करते हैं उदा। स्थानीयकरण, उदा। वास्तविकताओं का निर्माण? किसी अन्य लोकेल में बनाए गए एक ही वास्तविक युक्त स्ट्रिंग की तुलना में वास्तविक विफल हो जाएगा। या एक अलग सटीक सेटिंग के साथ स्ट्रिंग करने के लिए एक असली लिखा है।

यह मुझे लगता है कि बराबर() समस्या है, हैशिंग नहीं है। यदि "बराबर" मानों को स्ट्रिंग (या ब्लॉब) को अलग-अलग क्रमबद्ध किया जा सकता है, तो हैशिंग विफल हो जाएगी।

+0

यह एक अच्छा मुद्दा है। दो संभावित उत्तर हैं: (ए) इनविरिएंट सेटिंग्स का उपयोग करें ताकि हैश कोड कई उदाहरणों और लोकेशंस आदि पर भरोसेमंद हों, या (बी) किसी भी दिए गए रन के भीतर परिणाम सुसंगत नहीं हैं (हालांकि) किनारे के मामलों में चीजें बदलें और तोड़ें)। मेरे प्रश्न पर टिप्पणियों में जो कुछ कहा गया है, उसे देखते हुए - मैं चाहता हूं कि उन टिप्पणियों में से अधिकतर वास्तविक उत्तर थे - मैं अपने दृष्टिकोण की समीक्षा कर सकता हूं और व्यक्तिगत रूप से प्रकारों को संभाल सकता हूं, और तुलनाकर्ताओं आदि पर विचार करते समय डेल्फी जैसी समानता अर्थशास्त्र को संरक्षित करने की कोशिश नहीं करता एल्गोरिदम के लिए। –

2

हैश फ़ंक्शन और निर्दिष्ट आवश्यकताओं के उपयोग के बीच आपके प्रश्न में एक तनाव में अंतर्निहित तनाव है, जो हैश के इनपुट के विरुद्ध मान्य है। मेरा सुझाव है कि हम सामान्य रूप से हैश के कुछ गुणों को ध्यान में रखें: हैशिंग प्रक्रिया के दौरान जानकारी खो जाती है, और हैश टकराव की उम्मीद की जा सकती है। टकराव के बिना एक परिपूर्ण हैश बनाने के लिए संभव है, लेकिन यह एक सही हैश फ़ंक्शन बनाने के लिए समस्याग्रस्त (या असंभव?) होगा यदि फ़ंक्शन का डोमेन कोई संभावित ओएलई संस्करण है। दूसरी ओर, अगर हम एक परिपूर्ण हैश के बारे में बात नहीं कर रहे हैं, तो आपका पहला नियम उल्लंघन किया जाता है।

मैं जो हासिल करने की कोशिश कर रहा हूं उसके बड़े संदर्भ को नहीं जानता, लेकिन मुझे आपकी धारणाओं में से एक पर वापस धक्का देना चाहिए: क्या हैश फ़ंक्शन वास्तव में आप चाहते हैं? आपकी आवश्यकताओं को पूरी तरह से सरल तरीके से पूरा किया जा सकता है यदि आप एक ऐसी प्रणाली विकसित करते हैं जो एन्कोड करता है, हैश नहीं, सभी संभव ओएलई संस्करण विशेषताएँ ताकि उन्हें बाद में याद किया जा सके और अन्य संस्करण छवियों के मुकाबले तुलना की जा सके।

संस्करण को कनवर्ट करने के आपके आधारभूत कार्यान्वयन को इस दिशा में आगे बढ़ रहा है। जैसा कि आपको कोई संदेह नहीं है, एक संस्करण में पॉइंटर्स, डबल पॉइंटर्स और एरे शामिल हो सकते हैं, इसलिए आपको इन डेटा प्रकारों के लगातार स्ट्रिंग प्रस्तुति को विकसित करना होगा। मैं सवाल करता हूं कि क्या इस दृष्टिकोण को वास्तव में हैश के रूप में वर्गीकृत किया जा सकता है। क्या आप सिर्फ डेटा विशेषताओं को कायम नहीं रखते हैं?

+0

मैं रनटाइम लाइब्रेरी के लिए एक सामान्य संग्रह कक्षा लिख ​​रहा हूं। सामान्य पैरामीटर एक संस्करण हो सकता है। बिल्कुल सही हैशिंग प्रासंगिक नहीं है। (असल में, असफल हैश लुकअप की लागत में वृद्धि करके परिपूर्ण हैशिंग छोटे हैश टेबल में प्रतिकूल हो सकती है।) –

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