2011-01-31 10 views
5

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

मैं निश्चित रूप से System.Guid का उपयोग कर सकता हूं, लेकिन प्रत्येक ऑब्जेक्ट के लिए 128 बिट्स स्टोरेज खर्च होता है और मैं कम संसाधनों का उपभोग करना चाहता हूं। मैंने एक इंट 32 का उपयोग करने की कोशिश की और इसे System.Environment.TickCount संपत्ति के साथ शुरू किया, लेकिन मुझे पर्याप्त रिज़ॉल्यूशन नहीं मिला है और कुछ ऑब्जेक्ट्स उसी वैल्यू को असाइन किए गए हैं।

टिककॉन्टर के लिए प्रलेखन का कहना है कि टिककंट संपत्ति ~ 29 के बाद नकारात्मक हो जाएगी और फिर 2 9 दिनों में शून्य हो जाएगी। मैं समय के साथ एक छोटे रोल के लिए खुशी से अधिक संकल्प व्यापार करेंगे।

क्या मेरे पास अन्य विकल्प हैं जिन्हें मैं नहीं जानता?

+3

आपको कौन से संसाधन डरते हैं कि GUID का उपयोग अत्यधिक उपभोग करेगा? वह कथन समयपूर्व अनुकूलन की तरह थोड़ा सा लगता है। मैं ऐसे समाधान से शुरू करूंगा जो GUID का उपयोग करता है और यदि आप ठोस प्रदर्शन बाधाओं का सामना करते हैं तो केवल इसे पुनर्विचार करें। –

+0

मैं समस्या को सोचने पर था। मुझे ट्रैक पर लाने के लिए सभी को धन्यवाद। –

उत्तर

13

मैं एक पूर्णांक मान का उपयोग करने की सिफारिश करता हूं, और असाइनमेंट पर इसे स्वतः बढ़ाता हूं। इस ऑपरेशन थ्रेड को सुरक्षित बनाने के लिए आप Interlocked.Increment का उपयोग कर सकते हैं।

सबसे अधिक संभावना है कि इस कार्य के लिए 32 बिट पूर्णांक पर्याप्त होगा।

private static newObjectId = int.MinValue; 

private static int GetNextId() 
{ 
    return Interlocked.Increment(ref newObjectId); 
} 

तो आप एक नया, अनन्य पहचानकर्ता असाइन करने के लिए उपयोग कर सकते हैं कि आपके आधार वर्ग में: मैं की तरह कुछ की सिफारिश करेंगे।

+0

के निर्देशों की याद दिलाता है। :) –

+0

अच्छा एक। आप इसे कक्षा में डाल देंगे जिसके लिए आपको आईडी की आवश्यकता है, और कन्स्ट्रक्टर में असाइनमेंट करें। इंटरलॉक – KeithS

2

यदि विशिष्टता केवल एप्लिकेशन के जीवन के लिए है, तो क्या आप 32-बिट पूर्णांक का उपयोग नहीं कर सकते हैं, शून्य में प्रारंभ किया गया है, और फिर प्रत्येक ऑब्जेक्ट आवंटन के साथ बस बढ़ाया जा सकता है?

टिककाउंट या उसके जैसा कुछ भी चिंता करने की आवश्यकता नहीं है। नंबर "2" संख्याओं के बीच अद्वितीय है; यह "1" और "3" से अलग है क्योंकि यह "1,203,718" से है यदि आप परीक्षण कर रहे हैं तो समानता है।

+1

आपकी आखिरी वाक्य के बारे में कुछ मुझे पवित्र हाथ ग्रेनेड –

3

क्या आपको पहचानकर्ता को सभी ऑब्जेक्ट्स में या सिर्फ एक विशिष्ट प्रकार के भीतर अद्वितीय होने की आवश्यकता है?

  1. आप Object.GetHashCode() अधिभावी नहीं कर रहे हैं, तो यह आपके लिए एक सुंदर (लेकिन% नहीं 100) विश्वसनीय पहचानकर्ता दे देंगे:

    आप विकल्पों में से एक जोड़ी है। नोट, हालांकि, वह (दस्तावेज़ों के अनुसार), यह की गारंटी नहीं है। डुप्लिकेट मारने की आपकी संभावनाएं काफी कम हैं।

  2. यदि आप हैं (या 100% की आवश्यकता है), तो सबसे सरल समाधान आपकी कक्षा में private static long lastObjectId का उपयोग करना होगा। बेस कंस्ट्रक्टर के भीतर, वर्तमान ऑब्जेक्ट के मान के रूप में Interlocked.Increment(ref lasObjectId) का उपयोग करें।
  3. यदि आपको ऑब्जेक्टर्स को अद्वितीय ऑब्जेक्ट्स में अद्वितीय होने की आवश्यकता है, तो आप 2 के समान कुछ कर सकते हैं, लेकिन इन आईडी को प्रबंधित करने के लिए आपको केंद्रीय वर्ग का उपयोग करना होगा।
+0

+1 दिलचस्प। डॉक्टर का कहना है कि ऑब्जेक्टिड जेनरेटर को फॉर्मेटर के जीवनकाल के लिए धारावाहिकरण में उपयोग के लिए उपयोग किया जाता है, जिसने इसे बनाया है, और यह आईडी और ऑब्जेक्ट पते के बीच संबंध बनाए रखकर काम करता है। विवरण से यह स्पष्ट नहीं है कि किसी ऑब्जेक्ट के ऑब्जेक्टिडनरेटर का संदर्भ वस्तु के कचरा संग्रहण को रोक देगा या नहीं। क्या आप जानते हैं कि यह कमजोर संदर्भों का उपयोग करता है, या यदि प्रोग्राम के जीवन में उपयोग किए जाने पर यह स्मृति रिसाव का स्रोत हो सकता है? –

8

वस्तुओं आप जिसे उपयुक्त नाम दिया ObjectIDGenerator इस्तेमाल कर सकते हैं के लिए अद्वितीय आईडी है कि हम आसानी से आप के लिए प्रदान करते हैं बनाने के लिए:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.objectidgenerator.aspx

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

आप अपना ऑब्जेक्ट आईडी जेनरेटर बना सकते हैं जो कमजोर संदर्भ रखता है यदि आप चाहते थे; यह मुश्किल नहीं होगा।

+2

दिलचस्प के लिए –

+1

@ जेफरी: उत्कृष्ट बिंदु। हां, आईडी जनरेटर ऑब्जेक्ट को रेफरी रखता है। यह आंतरिक रूप से सिर्फ एक साधारण हैश टेबल है। –

+0

मैंने आज कुछ सीखा ... यही कारण है कि मुझे स्टैक ओवरफ्लो पसंद है। –

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