2012-09-24 25 views
7

मुझे अल्फान्यूमेरिक स्ट्रिंग से एक अद्वितीय आईडी (केवल int) उत्पन्न करने की आवश्यकता है।अल्फान्यूमेरिक स्ट्रिंग से अद्वितीय आईडी जेनरेट करें

उदा। मेरे पास सुरक्षा आईडी = 'एबीसी 123DEF' मुझे "सुरक्षा आईडी" की एक अद्वितीय आईडी (केवल int) उत्पन्न करने में सक्षम होना चाहिए ताकि अद्वितीय आईडी हमेशा स्थिर रहे।

उदा। सुरक्षा आईडी: एबीसी 123DEF इंट आईडी: 9463456892

ताकि मैं डेटाबेस में इंट आईडी स्टोर कर सकूं और किसी भी समय इंट आईडी से सुरक्षा आईडी को देख सकूं।

कुछ उदाहरण: PBG_CD_20120214_.2 | 201202-सीएमजी 188963_T | PBG_TD_20120306_.0001 3 उदाहरण: -पीआईपीई अलग

+0

हैशिंग में देखें। – SLaks

+0

आप बहुत विशिष्ट हैं यह एक int होना चाहिए, लेकिन कृपया int परिभाषित करें? आपके द्वारा डाली गई संख्या पारंपरिक int के लिए बहुत बड़ी है जो आम तौर पर 32-बिट्स को संदर्भित करती है, हालांकि लंबे समय तक फिट बैठती है। संख्यात्मक आईडी के अंतरिक्ष विरोधाभास क्या हैं? –

+0

हाय जिमी यह लंबे int हो सकता है। मुझे इस तरह से रखा जाना चाहिए। जेनरेट आईडी "संख्यात्मक (0 - 9)" – Anshul

उत्तर

1

आप प्रत्येक चरित्र को दो-अंकों की संख्या, 0-9 के रूप में संख्याओं के रूप में एन्कोड कर सकते हैं, 10-35 ए-जेड के रूप में।

उदाहरण के लिए, 9AC8 होगा 09 10 12 08 = 09101208.

संपादित करें: एक छोटी संख्या आप इस दृष्टिकोण (जावा शैली psuedocode के साथ) इस्तेमाल कर सकते हैं के लिए:

char[] availableChars = ['A', 'B', ... , '0', ... '9', '-', '_', '.']; 
long hash = 0; 
long base = 1; 
for (char c in string.toCharArray()) 
    for (int key=0; key < availableChars.length; key++) 
     if (availableChars[key] != c) 
      continue; 
     hash += base*key; 
     base = base*availableChars.length 

return hash; 
+0

में होनी चाहिए मेरे पास एक अल्फान्यूमेरिक स्ट्रिंग है: "201202-CMG277440_T" – Anshul

+0

की तरह क्या आपकी संख्या कितनी बड़ी हो सकती है? – redolent

+0

नहीं - संख्या कितनी बड़ी हो सकती है इस पर कोई सीमा नहीं है। – Anshul

21

बस का उपयोग जावा हैशिंग एल्गोरिदम। नहीं 100% अद्वितीय लेकिन आप एक आधार के रूप में इसका इस्तेमाल करते हैं और एक बहुत छोटे टक्कर सेट पर विशिष्टता की गारंटी करने के कुछ जोड़ सकते हैं:

public static int hash(String s) { 
    int h = 0; 
    for (int i = 0; i < s.length(); i++) { 
     h = 31 * h + s.charAt(i); 
    } 
    return h; 
} 

आदेश से बचने के लिए टक्कर 100% में, आप एक अभाज्य संख्या है कि तुलना में बड़ा है की जरूरत है अपने पात्रों के बीच व्यापक अंतर। तो 7-बिट ASCII के लिए, आपको 128 से अधिक की आवश्यकता है। तो 31 की बजाय, 131 (128 के बाद अगला प्राइम नंबर) का उपयोग करें। जिस हिस्से को मैंने चेक नहीं किया है वह यह है कि यदि उत्पन्न हैश आपके लंबे इंट्स के आकार से बड़ा हो जाएगा। लेकिन आप इसे वहां से ले जा सकते हैं ...

+0

मुझे लगता है कि यह काम करने जा रहा है। मुझे कोशिश करने दो। बहुत बहुत धन्यवाद। – Anshul

+3

यदि यह काम करता है तो समुदाय के लाभ के उत्तर को स्वीकार करना न भूलें – mprivat

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