ओएलई वेरिएंट, जैसा कि विजुअल बेसिक के पुराने संस्करणों और COM ऑटोमेशन में व्यापक रूप से उपयोग किया जाता है, कई प्रकार के स्टोर स्टोर कर सकते हैं: पूर्ण प्रकार जैसे पूर्णांक और फ्लोट, स्ट्रिंग और सरणी जैसे अधिक जटिल प्रकार, और IDispatch
कार्यान्वयन के सभी तरीके और ByRef
रूपों के रूप में पॉइंटर्स।हैशिंग ओएलई वेरिएंट के लिए अनुशंसित कार्यान्वयन क्या है?
वेरिएंट भी कमजोर टाइप किए गए हैं: वे आपके द्वारा लागू किए जाने वाले ऑपरेटर के आधार पर मूल्य को दूसरे प्रकार में परिवर्तित करते हैं और ऑपरेटर को दिए गए मानों के वर्तमान प्रकार क्या हैं। उदाहरण के लिए, दो प्रकारों की तुलना, जिसमें एक पूर्णांक 1
होता है और दूसरा स्ट्रिंग "1"
होता है, समानता के लिए True
वापस आ जाएगा।
तो यह सोचते हैं कि मैं अंतर्निहित डेटा स्तर पर भिन्न रूपों के साथ काम कर रहा हूँ (सी में VARIANT
जैसे ++ या डेल्फी में TVarData
- अलग संभावित मानों की बड़ी संघ यानी), मैं कैसे हैश चाहिए लगातार वेरिएंट इतना है कि वे सही पालन नियम?
नियम:
- विविधताएँ हैश असमान रूप में असमान की तुलना करनी चाहिए, दोनों छंटाई और प्रत्यक्ष समानता
- प्रकार है कि दोनों छंटाई और प्रत्यक्ष समानता हैश चाहिए के रूप में बराबर
हैशिंग फिट बनाने के लिए मुझे अलग सॉर्टिंग और प्रत्यक्ष तुलना नियमों का उपयोग करना ठीक है।
जिस तरह से मैं वर्तमान में काम कर रहा हूं वह है कि मैं तारों (यदि वे फिट हैं) के रूप में वेरिएंट को सामान्य कर रहे हैं, और उन्हें स्ट्रिंग के रूप में व्यवहार कर रहे हैं, अन्यथा मैं संस्करण डेटा के साथ काम कर रहा हूं जैसे कि यह एक अपारदर्शी ब्लॉब था, और हैशिंग और कच्चे बाइट की तुलना। इसमें कुछ सीमाएं हैं, बेशक: संख्या 1..10
[1, 10, 2, ... 9]
आदि के रूप में क्रमबद्ध करें। यह हल्का कष्टप्रद है, लेकिन यह लगातार है और यह बहुत कम काम है। हालांकि, मुझे आश्चर्य है कि इस समस्या के लिए एक स्वीकार्य अभ्यास है या नहीं।
वैरिएंट वास्तव में एक संरचना है, जिसमें डेटा के दो टुकड़े हैं - मूल्य और प्रकार। आपकी तुलना और रूपांतरण दावा केवल मूल्य को ध्यान में रखता है और उस संरचना के दायर प्रकार को नहीं देखता है। सही दृष्टिकोण हमेशा दायर प्रकार के बारे में भी विचार करना है। –
@ फ्रांसी, मुझे लगता है कि आप इस बिंदु को चूक गए हैं। दो प्रकार भिन्न होते हैं जब भी उनके प्रकार भिन्न होते हैं। यदि वेरिएंट बराबर की तुलना करते हैं, तो बैरी अपने हैंश को समान मानना चाहती है। 'संस्करण (1) = संस्करण ('1')' ==> 'हैश (संस्करण (1)) = हैश (संस्करण ('1'))'। –
बैरी, मुझे नहीं लगता कि आपका पहला नियम सही है। यह हैश टकराव की संभावना को अनदेखा करता है, जहां हैश बराबर हैं लेकिन मान समान नहीं हैं। –