2011-04-06 18 views
31

मैं सोच रहा था कि यूयूआईडी को एक अद्वितीय पूर्णांक में बदलने का सबसे आसान तरीका क्या होगा? मैंने हैश कोड का उपयोग करने की कोशिश की है लेकिन लोग मुझे बताते हैं कि अगर मैं हैश कोड का उपयोग करता हूं तो यह हमेशा अद्वितीय नहीं होगा?अद्वितीय पूर्णांक आईडी के लिए UUID?

तो सबसे आसान तरीका क्या है? हैश कोड अद्वितीय है?

+0

नहीं, यह परिभाषा के अनुसार नहीं है। इसके अलावा, अगर यह अद्वितीय था, तो फिर किसी को यूयूआईडी की आवश्यकता क्यों होगी? – Ingo

+0

अद्वितीय परिभाषित करें। वैश्विक स्तर पर, या सिर्फ आपके आवेदन के भीतर, या थोड़ा सा कोड? –

+0

यह सिर्फ कुछ मूर्खतापूर्ण विनिर्देशों के द्वारा मुझे एक एप्लिकेशन को पूर्ण पूर्णांक की आवश्यकता थी, मैं यूयूआईडी कक्षा का उपयोग करना चाहता था, लेकिन यह पता चला कि मैं इसे स्केल नहीं कर सकता। –

उत्तर

24

यूयूआईडी 128 बिट्स के बाद से आपको कोई समस्या होगी और int केवल 32 बिट है। आपको या तो टकराव का खतरा स्वीकार करना होगा और इसे एक छोटी सी जगह पर फेंकने की कोशिश करनी होगी (hashCode शायद ऐसा करने का एक अच्छा तरीका है) या एक विकल्प ढूंढें (UUID का उपयोग करें, BigInteger पर मानचित्र करें - बिना बताना मुश्किल है जानना क्यों)

+3

हैशकोड मुझे चाहिए। मेरे मामले में, मुझे एंड्रॉइड के अधिसूचना प्रबंधक के लिए अधिसूचना आईडी के रूप में एक int पास करने की आवश्यकता है। मैं उन अधिसूचनाओं के लिए टक्कर बर्दाश्त कर सकता हूं। – tmin

2

नहीं, हैश कोड अद्वितीय (और नहीं हो सकता) अद्वितीय है। GUID/UUID के साथ यह बात यह है कि आपको विशिष्टता की गारंटी के लिए सभी 128 बिट्स की आवश्यकता है, इसलिए इसे किसी भी तरह से स्केल करने से समस्याएं मिलेंगी, उदाहरण के लिए देखें। GUIDs are globally unique, but substrings of GUIDs aren't

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

+3

टिप्पणियाँ: 1) हैश कोड अद्वितीय हो सकता है। आप नहीं जानते [हालांकि इस पर भरोसा न करें] (http://security.stackexchange.com/a/52881/94827)। 2) आपके पास यूआईआईडी विशिष्टता की गारंटी नहीं है। टकराव कभी नहीं देखने की बस एक बहुत अच्छी संभावना है। 3) भले ही आपने इसे किसी भी तरह से स्केल किया हो, फिर भी, आप किसी भी समस्या को जरूरी नहीं बनाते हैं। आप टकराव का खतरा बढ़ाते हैं, हां, और आपको यूयूआईडी मानक तोड़ने के परिणामों से अवगत होना चाहिए, लेकिन कुछ स्थितियों में यह बिल्कुल ठीक हो सकता है। 4) लिंक मर चुका है। – Zero3

1

एक यूयूआईडी 16-बाइट संख्या (128 बिट) है। आप इसे विशिष्टता को संरक्षित करते समय int (32 बिट) में क्रंच नहीं कर सकते हैं।

गणितीय बोली जाने वाली: 2 UUIDs ही जावा int आकार के हैश मान साझा करेंगे (जो ... एक बहुत;))

एक तरह से बाहर - कुछ वास्तविक जीवन UUID अक्सर एक नहीं बल्कि है स्थैतिक हिस्सा तो अलग परिदृश्यों में, वास्तविक यूयूआईडी का अद्वितीय हिस्सा 32 बिट से कम हो सकता है।

9

का जवाब मैं एक अनन्य अनुप्रयोग विस्तृत पूर्णांक कैसे हो सकता है:

यह पुन: प्रारंभ हो जाने के बाद भी अद्वितीय होने की जरूरत है या यदि आप आवेदन क्लस्टर है आप एक डाटाबेस अनुक्रम का उपयोग कर सकते हैं।

यदि रनटाइम के दौरान इसे केवल स्थिर होने की आवश्यकता है तो एक स्थिर AtomicInteger का उपयोग करें।

संपादित करें (उदाहरण के लिए जोड़ा):

public class Sequence { 

    private static final AtomicInteger counter = new AtomicInteger(); 

    public static int nextValue() { 
    return counter.getAndIncrement(); 
    } 
} 

उपयोग:

int nextValue = Sequence.nextValue(); 

यह वह जगह है धागा सुरक्षित (अलग धागे हमेशा अलग-अलग मान प्राप्त होगा, और कोई मान "खो" किया जाएगा)

+0

क्या आप मुझे एटमिकइंटर का उपयोग करने का उदाहरण दे सकते हैं? –

+1

उपयोग संपादित किया जाना चाहिए; "काउंटर.नेक्स्टवैल्यू();", लेकिन वर्ग का नाम "अनुक्रम" –

+0

है, यह उपयोग केवल एकल जेवीएम द्वारा उपयोग किया जा सकता है, क्लस्टर (एकाधिक jvms) इस विकल्प का उपयोग नहीं कर सका। –

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