2012-07-03 23 views
40

उत्पन्न करें मैं विश्वविद्यालय में छात्र हूं और हमारा कार्य एक खोज इंजन बनाना है। सीमा में जोड़े जाने पर मुझे प्रत्येक यूआरएल को असाइन करने के लिए एक अद्वितीय आईडी उत्पन्न करने में कठिनाई हो रही है। मैंने एसएचए -256 हैशिंग एल्गोरिदम के साथ-साथ गइड का उपयोग करने का प्रयास किया है।एक अद्वितीय आईडी

public string generateID(string url_add) 
{ 
    long i = 1; 

    foreach (byte b in Guid.NewGuid().ToByteArray()) 
    { 
     i *= ((int)b + 1); 
    } 

    string number = String.Format("{0:d9}", (DateTime.Now.Ticks/10) % 1000000000); 

    return number; 
} 
+1

एक GUID विश्व स्तर पर अद्वितीय (इसलिए नाम) होना चाहिए, इसलिए मुझे समस्या समझ में नहीं आती है। – CodeCaster

+0

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

+1

हमेशा [ऑब्जेक्ट। गेटहाशकोड()] (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx) है। हालांकि मुझे नहीं लगता कि यह अद्वितीय होने की गारंटी है। – RichardTowers

उत्तर

60

क्यों नहीं ToString का उपयोग करें?

public string generateID() 
{ 
    return Guid.NewGuid().ToString("N"); 
} 

आप इसे एक यूआरएल के आधार पर किया चाहते हैं, तो आप बस कर सकता है निम्नलिखित:

public string generateID(string sourceUrl) 
{ 
    return string.Format("{0}_{1:N}", sourceUrl, Guid.NewGuid()); 
} 

आप URL को छिपाना चाहते हैं, तो आप किसी न किसी रूप SHA1 की पर इस्तेमाल कर सकते हैं sourceURL, लेकिन मुझे यकीन नहीं है कि यह क्या हासिल कर सकता है।

+0

यह काम किया ... मैं शुरू में चाहता था कि आईडी यूआरएल पर आधारित हो लेकिन यह ठीक काम करने लगता है। क्या यह अनन्य कुंजी की बड़ी मात्रा उत्पन्न करने में सक्षम होगा? चूंकि सर्च इंजन बड़ी मात्रा में यूआरएल –

+11

के साथ काम करेगा क्योंकि यह लगभग [5,316,911,983,139,663,491,615,228,241,121,400,000] (http://answers.google.com/answers/threadview/id/553194.html) अद्वितीय मानों का उत्पादन करने में सक्षम होगा। –

+0

बहुत बहुत धन्यवाद! पर्याप्त से अधिक चीजें हैं क्योंकि यूआरएल को सीमा से पुनर्प्राप्त किया जाता है, फिर उन्हें –

20

GUID क्यों उपयोग नहीं करते हैं: यहाँ कोड है कि मैं GUID को लागू करने के लिए प्रयोग किया जाता है?

Guid guid = Guid.NewGuid(); 
string str = guid.ToString(); 
3

आप उपयोग करना SHA-256 (GUID तेजी से होगा) चाहते हैं तो आपको तरह

SHA256 shaAlgorithm = new SHA256Managed(); 
byte[] shaDigest = shaAlgorithm.ComputeHash(ASCIIEncoding.ASCII.GetBytes(url)); 
return BitConverter.ToString(shaDigest); 

बेशक कुछ करने के लिए यह ASCII की जरूरत नहीं है और जरूरत है, यह किसी भी अन्य प्रकार किया जा सकता है हैशिंग एल्गोरिदम के साथ-साथ

+2

का उपयोग करें, मैं कुछ यूनिकोड एन्कोडिंग के पक्ष में ASCII से बचूंगा। अपने कोड दिए गए टकराव ढूंढना मुश्किल है। – CodesInChaos

+0

मुझे पता है, ऐसा इसलिए है क्योंकि मैं फिलहाल एक विरासत प्रणाली के साथ काम कर रहा हूं इसलिए मुझे एसीआईआई के लिए वायर्ड किया गया है :) –

+0

मैं चाहता हूं कि आईडी यूआरएल के आधार पर अद्वितीय हो। जिस तरह से मैंने कोड –

1

इस प्रश्न का उत्तर दिया जाना चाहिए, हालांकि पूर्णता के लिए, मैं एक और दृष्टिकोण जोड़ूंगा।

आप एक अद्वितीय आईडी संख्या जनरेटर का उपयोग कर सकते हैं जो ट्विटर के Snowflake आईडी जनरेटर पर आधारित है। सी # कार्यान्वयन here पाया जा सकता है।

var id64Generator = new Id64Generator(); 

// ... 

public string generateID(string sourceUrl) 
{ 
    return string.Format("{0}_{1}", sourceUrl, id64Generator.GenerateId()); 
} 

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

// node 0 
var id64Generator = new Id64Generator(0); 

// node 1 
var id64Generator = new Id64Generator(1); 

// ... node 10 
var id64Generator = new Id64Generator(10); 
+0

उत्पन्न करने के बारे में सोचा था, टिप के लिए धन्यवाद! ठीक वही जो मेरे द्वारा खोजा जा रहा था। – dotnetguy

+0

https://github.com/RobThree/IdGen पर कोड के साथ एक NuGet है जो समान हिमपात-आधारित आईडी भी करता है। क्या FlakeId के लिए कोडप्लेक्स कोड आपके स्वामित्व में है? मैं इसे गिटूब में ले जाना चाहता हूं और अगर यह ठीक है तो एक नाजेट करना चाहते हैं? – dotnetguy

+0

@ डॉटनेटग्यू, हाँ, मेरे पास वह है। निश्चित रूप से, आप github माइग्रेशन और nuget पैकेज के साथ पालन कर सकते हैं। – Tom

-3

इसे आजमाएं।

string a = DateTime.Now.Month.ToString() + 
      DateTime.Now.Day.ToString() + 
      DateTime.Now.Year.ToString() + 
      DateTime.Now.Hour.ToString() + 
      DateTime.Now.Minute.ToString() + 
      DateTime.Now.Second.ToString() + 
      DateTime.Now.Millisecond.ToString(); 
+4

डेटटाइम नहीं है.अब.ToString ("ddMMyyyyHHmmssfff") आसान है? वैसे भी, इस तरह के दृष्टिकोण यातायात के इंटरनेट पैमाने पर गिरते हैं। – dotnetguy

+0

मैंने अभी इसे समझना आसान बना दिया है। –

+0

खराब तरीका। समांतर धागे एक ही आईडी उत्पन्न कर सकते हैं। और कुछ पर्यावरण निर्भरताएं हैं, जैसे स्थानीयकरण, स्थानीय सर्वर समय। –

2

हम नीचे एक अद्वितीय आईडी क्यों नहीं बना सकते हैं।

हम डेटटाइम.Now.Ticks और Guid.NewGuid()। ToString() को एक साथ जोड़कर एक अद्वितीय आईडी बनाने के लिए उपयोग कर सकते हैं।

डेटटाइम के रूप में.अब .िक्स जोड़ा जाता है, हम सेकंड में दिनांक और समय निकाल सकते हैं जिस पर अद्वितीय आईडी बनाई जाती है।

कृपया कोड देखें।

var ticks = DateTime.Now.Ticks; 
var guid = Guid.NewGuid().ToString(); 
var uniqueSessionId = ticks.ToString() +'-'+ guid; //guid created by combining ticks and guid 

var datetime = new DateTime(ticks);//for checking purpose 
var datetimenow = DateTime.Now; //both these date times are different. 

हम भी विशिष्ट आईडी में टिक का हिस्सा लेने के लिए और भविष्य में संदर्भ के बाद की तारीख और समय के लिए देख सकते हैं।

1

यहां आईडी जनरेटर जैसे 'यूट्यूब-वीडियो-आईडी' है। "UcBKmq2XE5a"

StringBuilder builder = new StringBuilder(); 
Enumerable 
    .Range(65, 26) 
    .Select(e => ((char)e).ToString()) 
    .Concat(Enumerable.Range(97, 26).Select(e => ((char)e).ToString())) 
    .Concat(Enumerable.Range(0, 10).Select(e => e.ToString())) 
    .OrderBy(e => Guid.NewGuid()) 
    .Take(11) 
    .ToList().ForEach(e => builder.Append(e)); 
string id = builder.ToString(); 

यह आकार 11 वर्ण के यादृच्छिक आईडी पैदा करता है। आप उसमें वृद्धि/कमी भी कर सकते हैं, बस विधि विधि के पैरामीटर को बदलें।

0.001% 100 मिलियन में डुप्लिकेट।

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