2009-04-15 10 views
5

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जहां मुझे अद्वितीय, अनुक्रमिक आईडी उत्पन्न करने की आवश्यकता है। मेरी बाधाओं में से एक यह है कि उनमें 3 अंकों के बाद 2 अक्षर (केवल 600k आईडी) होना चाहिए। आईडी के मेरे अपेक्षाकृत छोटे पूल को देखते हुए मैं बस सभी संभावित आईडी उत्पन्न करने, उन्हें शफल करने और उन्हें डेटाबेस में डालने पर विचार कर रहा था। चूंकि, आंतरिक रूप से, मेरे पास उपयोग करने के लिए एक सरल, अनुक्रमिक, आईडी होगी, एक बार & पर उन्हें बाहर निकालना आसान होगा, मेरे पास कोई दोहराना नहीं है।संख्याओं के अनुक्रम को यादृच्छिक दिखने वाले आईडी में कनवर्ट करें?

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

+0

वास्तव में उपयोग करने पर आप कितने आईडी योजना बना रहे हैं? इतने सारे उत्पन्न करने के लिए शर्म की बात होगी और उदाहरण के लिए केवल कुछ सौ का उपयोग करने के लिए उन्हें स्टोर करें। –

+0

यह क्यों मायने रखता है कि वे अनुक्रमिक हैं? – ninesided

उत्तर

4

पर डिफ़ॉल्ट है, जिसे आप अनुकूलित करने की कोशिश कर रहे हैं (गति, स्मृति उपयोग इत्यादि) के आधार पर कई अलग-अलग तरीकों से किया जा सकता है।

आईडी पैटर्न = ddd ग 1 ग [0]

विकल्प 1 (अनिवार्य रूप से हैशिंग, ज़क के लिए इसी तरह की तरह):
1 0 और संभावनाओं की संख्या (676k) के बीच एक यादृच्छिक संख्या उत्पन्न करें। संयोजन

ddd = random/(26^2) 
    c[0] = random % (26) 
    c[1] = (random/26) % 26 

3- क्वेरी डीबी एक नि: शुल्क एक जब तक पहचान पत्र और वेतन वृद्धि के अस्तित्व के लिए करने के लिए
2- Convert संख्या पाया जाता है।

विकल्प 2 (रैखिक प्रतिक्रिया शिफ्ट रजिस्टर, देख wikipedia): रेंज (0,676k) में एक यादृच्छिक संख्या के साथ
1- बीज।(नीचे कारण है कि आप के साथ बीज नहीं कर पा रहा '0')
2- वर्तमान आईडी नंबर के लिए निम्न लागू करने

num = (num >> 1)^(-(num & 1u) & 0x90000u);

3- सीमा से बड़ा आईडी जाएं द्वारा बाद में यादृच्छिक संख्या उत्पन्न करें (यानी 0xA50A0 +)
4- आईडी प्रारूप (ऊपर के रूप में) में नंबर बदलें
* आपको आईडी के लिए उपयोग की गई अंतिम संख्या को सहेजने की आवश्यकता होगी, लेकिन आपको यह देखने के लिए डीबी से पूछने की आवश्यकता नहीं होगी कि इसका उपयोग किया जाता है या नहीं। एलएफएसआर काम करने के तरीके के कारण यह समाधान [000 एए] को छोड़कर सभी संभावित आईडी का आकलन करेगा।

[संपादित करें] के बाद से अपने सीमा वास्तव में से बड़ा तुम्हारी जरूरत है, तो आप वापस 1 घटा कर [000 एए] प्राप्त कर सकते हैं इससे पहले कि आप आईडी में बदल जाएंगे और अपने मान्य श्रेणी होना है (0,0xA50A0]

+0

का उपयोग करता है मैं उत्सुक हूं। वह एलएफएसआर एल्गोरिदम कहां से आया? –

1

तुम क्या के रूप में अनुक्रमिक परिभाषित पर निर्भर करता है, तो आप सिर्फ एक निश्चित प्रारंभिक बिंदु पत्र पर, इस तरह के तीन अंक के माध्यम से 'आ', और बस पाश के रूप में ले सकता है, तो यह होगा: 001aa 002aa 003aa

एक बार जब आप zz पर पहुंच जाते हैं तो संख्या भाग में वृद्धि करें।

4

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

+0

आप इसे संग्रहीत प्रक्रिया में समाहित कर सकते हैं जो एक अप्रयुक्त आईडी लौटाता है। इस तरह आप आईडी के – ninesided

4

एक सीमित समूह का उपयोग करें। असल में, 32 या 64-बिट पूर्णांक लें, और एक बड़ी संख्या पाएं जो आपके पूर्णांक के लिए अधिकतम मान पर coprime है; इस नंबर को कॉल करें एम। फिर, सभी पूर्णांक एन के लिए, एन * एम के परिणामस्वरूप एक अद्वितीय संख्या होगी जिसमें बहुत से अंक होंगे।

यह लाभ है कि आपको डेटाबेस को पूर्व-भरने की आवश्यकता नहीं है, या एक अलग चयन क्वेरी चलाने की आवश्यकता नहीं है - आप इसे n करके केवल एक ऑटो-वृद्धि करके अपने सभी को एक सम्मिलित कथन के भीतर कर सकते हैं , और एक अलग आईडी कॉलम है जो एन * एम

+0

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

0

आप मॉड्यूलर अंकगणितीय इस्तेमाल कर सकते हैं आईडी उत्पन्न करने के लिए एक नंबर 676,000 के साथ और एक बीज के लिए coprime है कि उठाओ id तालिका के मानक incrementing आईडी है तो निम्नलिखित स्यूडोकोड तुम क्या जरूरत है:।।।

uidNo = (id * seed) % 676000 
digits = uidNo/676 
char1 = uidNo % 26 
char2 = (uidNo/26) % 26 
uidCode = str(digits) + chr(char1+65) + chr(char2+65) 

एक उपयोगकर्ता हैं लगातार एक से अधिक जारी आईडी है, वे एल्गोरिदम और बीज अनुमान लगा सकते हैं और क्रम में सभी आईडी उत्पन्न कर सकते हैं। यह हो सकता है इसका मतलब है कि एल्गोरिदम आपके उपयोग के मामले के लिए पर्याप्त सुरक्षित नहीं है।

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