2010-02-01 14 views
17

अद्वितीय आईडी कैसे उत्पन्न करें जो जावा में पूर्णांक है जो अगली संख्या का अनुमान नहीं लगाता है?जावा (इंटीजर) में अनन्य आईडी कैसे उत्पन्न करें?

+8

शायद आप अपनी आवश्यकताओं के संदर्भ के बारे में थोड़ा और अधिक सटीक होना चाहिए। – svachon

उत्तर

50

कैसे अद्वितीय यह होने की जरूरत है?

यदि यह केवल प्रक्रिया के भीतर अद्वितीय है, तो आप AtomicInteger का उपयोग कर सकते हैं और प्रत्येक बार आपको एक नया मान की आवश्यकता होने पर incrementAndGet() पर कॉल कर सकते हैं।

+7

+1, इसे पोस्ट करने वाला था। – BalusC

+1

Integer.MIN_VALUE के साथ प्राइम परमाणु इंटेगर के लिए भी बेहतर। यह डिबगिंग में मदद करता है और आपको खेलने के लिए और अधिक संख्या देता है। – reccles

+3

आपको अतिप्रवाह के बारे में भी सोचने की आवश्यकता है। 'अगर (curInt == Integer.MAX_INT) की तरह smth' परमाणु इंटेगर –

1

बस आईडी उत्पन्न करें और जांचें कि यह पहले से मौजूद है या नहीं, आपकी जेनरेट की गई आईडी की सूची में।

8
int uniqueId = 0; 

int getUniqueId() 
{ 
    return uniqueId++; 
} 

synchronized जोड़े यदि आप इसे सुरक्षित थ्रेड करना चाहते हैं।

+1

जब यह पूर्णांक बहुत अधिक हो और रोल हो जाए तो अपवाद जोड़ना चाहें। इसके अलावा Integer.MinInt() पर अद्वितीय आईडी शुरू करना चाह सकता है (विधि को ऐसा कुछ कहा जाता है)। – sixtyfootersdude

+1

यह तब तभी काम करेगा जब प्रक्रिया बिना रोक के हमेशा के लिए चलती है। पुनरारंभ किए गए ऐप्स के लिए, यह प्रत्येक बार 0 से शुरू होगा। – talonx

+0

ठीक है, कोई भी पहले स्थान पर इंटेगर की बजाय लांग का उपयोग करने के बारे में सोच सकता है। –

2
+0

यह एक पूर्णांक नहीं लौटाता है। प्रारूप हेक्सस्ट्रिंग है, जैसे '20e8f3d6-3f8d-475b-8c19-9619a78bbdc8'। – BalusC

+0

@ बालससी: यह केवल स्ट्रिंग आउटपुट है जिसके बारे में आप बात कर रहे हैं। आंतरिक रूप से एक यूयूआईडी 128-बिट मान है और इसलिए इसे पूर्णांक के रूप में समझा जा सकता है (हालांकि BigInteger के बावजूद)। – Adamski

+1

फिर भी, यह एक पूर्णांक में फिट नहीं है। – BalusC

4

यदि आप कुछ हद तक सीमित हैं तो यह आसान है।

यदि आपके पास एक धागा है, तो आप केवल अद्वितीय आईडी ++ का उपयोग करें; बाहर निकलने पर वर्तमान अद्वितीय आईडी को स्टोर करना सुनिश्चित करें।

यदि आपके पास एकाधिक धागे हैं, तो एक सामान्य सिंक्रनाइज़ जेनर यूनिकिड विधि काम करता है (ऊपर जैसा ही लागू होता है)।

समस्या तब होती है जब आपके पास कई CPUs होते हैं - या तो क्लस्टर में या कुछ पीयर-टू-पीयर गेम जैसे कुछ वितरित सेटअप।

उस स्थिति में, आप आम तौर पर एक ही संख्या बनाने के लिए दो भागों को जोड़ सकते हैं। उदाहरण के लिए, प्रत्येक प्रक्रिया जो एक अद्वितीय आईडी उत्पन्न करती है, उसके पास 2-बाइट आईडी नंबर असाइन किया जा सकता है और उसके बाद इसे एक अद्वितीय आईडी + के साथ संयोजित किया जा सकता है। की तरह कुछ:

return (myID << 16) & uniqueID++ 

यह "MyID" भाग वितरण मुश्किल हो सकता है, लेकिन वहाँ कुछ तरीके हैं। आप केवल केंद्रीकृत डेटाबेस से एक को पकड़ सकते हैं, एक केंद्रीकृत सर्वर से एक अद्वितीय आईडी का अनुरोध कर सकते हैं ...

यदि आपके पास इंट की बजाय लंबी अवधि है, तो सामान्य चालों में से एक डिवाइस आईडी (यूयूआईडी) लेना है) ETH0 की, जो कि सर्वर के लिए अद्वितीय होने की गारंटी है - फिर बस एक सीरियल नंबर जोड़ें।

1

तुम सच में नहीं बल्कि पूर्णांक से पूर्णांक मतलब हैं:

Integer id = new Integer(42); // will not == any other Integer 

आप अन्य प्रक्रियाओं के लिए या उपयोगकर्ता, लगातार, या अन्य कारणों की मेजबानी के लिए एक JVM के बाहर कुछ दिखाई चाहते हैं, तो वहाँ अन्य तरीके हैं , लेकिन संदर्भ के बिना आप शायद अपने सिस्टम के भीतर ऑब्जेक्ट पहचान की अंतर्निहित विशिष्टता का उपयोग करके बेहतर तरीके से उपयोग कर रहे हैं।

1

क्या आपको इसकी आवश्यकता है;

  • एक ही समय में पर चल रहे दो जेवीएम के बीच अद्वितीय।
  • अद्वितीय अगर भी JVM पुनरारंभ किया गया है।
  • थ्रेड-सुरक्षित।
  • समर्थन शून्य? यदि नहीं, int या long का उपयोग करें।
+0

बिल के। ने पहले मामले के लिए एक समाधान दिया, यानी यदि आईडी 2 जेवीएम के बीच अद्वितीय होना चाहते हैं तो क्या किया जा सकता है। JVM पुनरारंभ होने के बाद भी यह सुनिश्चित करने के लिए सही दृष्टिकोण क्या है कि आईडी अद्वितीय है? – user1071840

+0

ओह, एक केंद्रीकृत डेटाबेस से एक अद्वितीय आईडी का अनुरोध करने के बाद भी पुनरारंभ होगा। – user1071840

1
import java.util.UUID; 

public class IdGenerator { 
    public static int generateUniqueId() {  
     UUID idOne = UUID.randomUUID(); 
     String str=""+idOne;   
     int uid=str.hashCode(); 
     String filterStr=""+uid; 
     str=filterStr.replaceAll("-", ""); 
     return Integer.parseInt(str); 
    } 

    // XXX: replace with java.util.UUID 

    public static void main(String[] args) { 
     for (int i = 0; i < 5; i++) { 
      System.out.println(generateUniqueId()); 
      //generateUniqueId(); 
     } 
    } 

} 

आशा यह आप में मदद करता है।

+2

-1। जबकि एक यूयूआईडी निश्चित रूप से एक अद्वितीय मूल्य प्रदान करेगा, इस बात की कोई गारंटी नहीं है कि जब आप अपना हैशकोड लेते हैं तो यह विशिष्टता बनी रहती है। आप Integer.MIN_VALUE और Integer.MAX_VALUE के बीच एक यादृच्छिक संख्या चुन सकते हैं और सर्वोत्तम के लिए आशा कर सकते हैं। –

+0

ऐसा नहीं है। UUID.randomUUID() एक क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक संख्या जेनरेटर का उपयोग करता है, ताकि कमजोर छद्म यादृच्छिक संख्या जनरेटर का उपयोग करने से बेहतर होना चाहिए। –

-2

किसी भी समय अनोखा:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff); 
+0

[इस उत्तर] का संदर्भ [http://stackoverflow.com/a/2979239/344480), 'System.currentTimeMillis() 'अद्वितीय मान वापस नहीं करता है। – Matthias

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