2010-01-12 10 views
6

के लिए शॉर्टिंग स्ट्रिंग मैं बिट्स आदि जैसे यूआरएल में उपयोग करने के लिए स्ट्रिंग-फाइल आईडी को विशिष्ट रूप से छोटा करना चाहता हूं। मैं डीबी से आईडी का उपयोग कर सकता हूं लेकिन मैं यूआरएल को यादृच्छिक होना चाहता हूं।सी # यूआरएल

सबसे अच्छा समाधान क्या होगा?

साइट एक मोबाइल साइट हो जाएगा तो मैं के रूप में संभव

+0

क्या आप चाहते हैं कि आप bit.ly सेवा का उपयोग करें? या क्या आपको अपना कस्टम एक रोल करना है? – keyboardP

+0

यह मेरी अपनी साइट के लिए है और यह यूआरएल शॉर्टिंग सेवा नहीं है बल्कि फाइलों के लिए अद्वितीय लघु यूआरएल बनाने के लिए – nLL

+2

कारण मैंने पूछा था, क्योंकि आप bit.ly api: http://www.emadibrahim.com/ का उपयोग कर सकते थे 200 9/05/07/शॉर्ट-यूआरएल-साथ-बिट-ए-ए-इन-नेट/ – keyboardP

उत्तर

6

के रूप में कम आप "विशिष्ट छोटा" नहीं कर सकते हैं मनमाने ढंग से तार करने के लिए यह करना चाहते हैं। कबूतर सिद्धांत और सब।

आप क्या करना चाहते हैं (और, AFAIK जो यूआरएल-शॉर्टिंग सेवाएं करता है) सबमिट की गई सब कुछ का डेटाबेस रखता है, और छोटी स्ट्रिंग का उपयोग किया जाता है। फिर आप इसे डेटाबेस में देख सकते हैं।

आप प्रत्येक बार के लिए बस संख्या और बेस 64 एन्कोडिंग करके छोटे स्ट्रिंग उत्पन्न कर सकते हैं।

+0

मैंने इसके बारे में सोचा लेकिन यह पूछताछ डीबी बिंदु – nLL

+8

से थोड़ा महंगा नहीं होगा यह डेटाबेस के लिए डिज़ाइन किया गया है। –

+0

+1 वृद्धि और बेस 64 एन्क। ऐसा लगता है कि ओपी क्या पूछ रहा है। –

0

एक यादृच्छिक अल्फा-न्यूमेरिक स्ट्रिंग स्टोर करें और अपने छोटे यूआरएल के लिए इसका उपयोग करें। इसे अपनी लंबाई के लिए सबसे अच्छा लगता है और यह उपयोगकर्ता www.yoursite.com/d8f3

+0

ओई की भी आवश्यकता होगी, -1 को सौंपना पसंद नहीं है, लेकिन ग्रिड कटाव एक , तो यादृच्छिक बाइट्स भी एक हो जाता है। हो सकता है कि यदि आप "टकराव हैंडलर लिखते हैं" - क्योंकि मैं रिक्त कर सकता हूं, लेकिन अद्वितीय मूल्यों के स्थान पर यादृच्छिक मूल्यों की वकालत करना सिर्फ सादा गलत है :( –

+2

मैंने उन्हें स्टोर किया। अपनी संग्रहण प्रक्रिया के दौरान वह एक चेक कर सकता है कि वह उन्हें अपने डेटाबेस में अद्वितीय के रूप में रखने से पहले अद्वितीय। मुझे लगता है कि यह एक गलती हैंडलर लिखने के लिए पर्याप्त मूर्ख नहीं है। – RHicke

0

कुछ चीजें हैं जो आप बहुत कम यूआरएल बनाने के लिए हैश (उदाहरण के लिए सीआरसी 32) का उपयोग कर सकते हैं। जब आप डेटा को कम कर रहे हों तो आप कभी भी 'अद्वितीय' यूआरएल नहीं प्राप्त पाएंगे, इसलिए टकराव होना चाहिए।

5

मैपिंग सेवा को लागू करने के दो तरीके हैं जैसे कि आप वर्णन करते हैं।

  1. ग्राहकों दुनिया भर में अद्वितीय आईडी सबमिट करते हैं, या
  2. सर्वर विश्व स्तर पर उत्पन्न करता है अद्वितीय आईडी

ग्राहकों दुनिया भर में अद्वितीय आईडी

जहाँ तक मुझे पता है, 1. केवल प्रयास किया जाना चाहिए प्रस्तुत Guid एस के साथ, जब तक कि आप एक छोटी बाइट स्ट्रीम में पर्याप्त रूप से अलग जानकारी को क्रैक करने के लिए समान साधन नहीं बनाते। किसी भी तरह से, अगर आप बाइट्स की एक धारा है कि एक विश्व स्तर पर अद्वितीय पहचानकर्ता का प्रतिनिधित्व करते है, तो आप कुछ इस

// source is either a Guid, or some other globally unique byte stream 
byte[] bytes = Guid.NewGuid().ToByteArray(); 
string base64String = Convert.ToBase64String (bytes).Trim ("="); 

की तरह अक्षर या अंक कि यादृच्छिक प्रतीत होता है की एक उपयोगकर्ता के पठनीय स्ट्रिंग प्राप्त करने के लिए ऐसा कर सकते हैं, लेकिन अन्य यादृच्छिक में निहित टकराव से बचा जाता है योजनाओं। Guid में 16 बाइट्स या 128 बिट्स शामिल हैं, जो पूर्ण बेस 64 एन्कोडिंग के लिए लगभग 19 वर्णों का अनुवाद करते हैं।

इस दृष्टिकोण का लाभ यह है कि ग्राहक केंद्रीय प्राधिकरण के बिना अपना स्वयं का छोटा यूरिस उत्पन्न कर सकते हैं। क्यों न हम स्वीकार करते हैं - - नकारात्मक पक्ष यह मोटी लंबाई अगर आप Guid के साथ रोल, या अपने स्वयं वैश्विक रूप से अद्वितीय बाइट धारा जो लागू करने है त्रुटियों की संभावना है।

आप इस मार्ग जाना करते हैं, दुनिया भर में अद्वितीय बाइट धाराओं या इस तरह के Google'ing पर विचार करें। ओह, और दूर रैंडम बाइट्स से रहना, अन्यथा आप अपने छोटे उरी जनरेटर के टॉप पर टक्कर संकल्प निर्माण करना होगा।

सर्वर विश्व स्तर पर उत्पन्न करता है अद्वितीय आईडी

फिर, इसके बाद के संस्करण के लिए प्राथमिक लाभ यह है कि ग्राहक की उनकी Uris एक प्रायोरी उत्पन्न हो सकता है है। विशेष रूप से काम करता है, तो आप के बारे में एक लंबा चलने के अनुरोध को जाँच करना चाहते हैं प्रस्तुत करने के लिए कर रहे हैं। यह आपकी स्थिति के लिए विशेष रूप से प्रासंगिक नहीं हो सकता है, और केवल सीमित मूल्य प्रदान कर सकता है।

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

5 वर्णों का इच्छित लंबाई यह मानकर, और मान लीजिए कि आप जाना एक Base64 एन्कोडिंग के साथ, प्रत्येक आईडी प्रति चरित्र 35 बिट या 2^35 [34 359 738 368] विशिष्ट मान 7 के बराबर बिट्स द्वारा अप करने के लिए 5 अक्षर का प्रतिनिधित्व कर सकते चलो । यह एक काफी बड़ा डोमेन है। *

तो यह किसी दिए गए प्रस्तुत करने के लिए एक मूल्य के लौटने का सवाल बन जाता है। शायद यह करने के लिए एक महान कई कई तरीके हैं, लेकिन मैं कुछ इस तरह के साथ एक "मुक्त सूची" के भीतर अपने डेटाबेस में

  • निकालें मूल्य मुक्त सूची से जब भस्म जाना,

    • की गणना के लिए सभी संभव मूल्यों हैं
    • मुक्त सूची मूल्य जोड़े जब जारी किया

    संवर्द्धन या अनुकूलन

    • शामिल हो सकते हैं पर रेंज [0, 2^35] हर मूल्य की गणना न करें, बल्कि एक प्रबंधनीय सबसेट की गणना, एक समय में कहते हैं कि 100 000 मूल्यों, और जब सभी मूल्यों खपत होती है, बस अनुक्रम में एक और 100 000 मूल्यों पैदा करते हैं और जारी रखने के
    • जोड़ें मूल्यों के लिए एक समाप्ति तिथि, और आपकी सेवा, वितरित दिन
    • की अवधि समाप्त हो मूल्यों अंत रीसायकल जब parallelizing आपकी सेवा बस

    निष्कर्ष वितरित सेवाओं के लिए अपने नि: शुल्क सूची के छोटे परस्पर अनन्य सबसेट ख़ैरात

    निष्कर्ष यह है कि आप guara करना चाहते हैं ntee विशिष्टता - तो टक्कर एक बड़ी संख्या नहीं है।


    * = 34 35 9 738 368 कच्चे डोमेन का आकार है, यह 0 लंबाई से 5 लंबाई की सभी आईडी है। आप कम से कम और 5 लंबाई की अधिकतम करने के लिए सभी आईडी सीमित में रुचि रखते हैं, तो अपने डोमेन 4 (2^28) को 5 (2^35) कम लंबाई 0 के सभी आईडी के लिए लंबाई 0 के सभी आईडी की तरह दिखता है 2 है^35 - 2^28 = 34 091 302 9 12, जो अभी भी काफी बड़ा है :)

  • -2

    हे एनएल, जैसा कि कई अन्य लोगों ने आपको बताया है .. यदि आप यूआरएल को कुछ छोटे से संपीड़ित करना शुरू करते हैं तो यह आपके लिए असंभव होगा इसे अद्वितीय रखें। उस ने कहा, आपको जमा किए गए प्रत्येक यूआरएल के लिए आपको अपना कोडिंग करने की आवश्यकता है। ऐसा करने का एक तरीका (आसान) है, सबमिट किए गए यूआरएल से डेटाबेस बनाने का प्रयास करें और उसके बाद प्रत्येक के लिए एक ग्रिड फ़ील्ड जेनरेट करें और उसके बाद से प्रत्येक ऑब्जेक्ट को सुनिश्चित करने से सुनिश्चित करें कि प्रत्येक बार जब आप कुछ पंजीकृत करते हैं तो यह पिछले से बिल्कुल अलग है।

    उदाहरण के लिए: www.google।गाइड के साथ कॉम F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 ->http://www.mysite.com/?q=CEB2

    जितना अधिक वर्ण आप उपयोग करते हैं, उतने अधिक लिंक आप ट्रैक रख सकते हैं। इस नमूने के लिए आपके पास 65536 अलग-अलग लिंक होंगे (हेक्स पर केवल 4 वर्ण होंगे)।

    उम्मीद है कि इससे मदद मिलती है।

    +1

    क्षमा करें, -1 ग्रिड को छेड़छाड़ करने के लिए। केवल खराब खराब अभ्यास। केवल एक संपूर्ण ग्रिड अद्वितीय होने की गारंटी है। किसी भी हिस्से या ग्रिड का सबसेट लेना नहीं है। प्रत्येक-छोटी-बिट-मायने रखता है। –

    +0

    मुझे जॉनी पता है, और आप मेरी किसी भी पोस्ट में कोई संदर्भ नहीं ढूंढ सकते जहां मैं एक सबसेट कह रहा हूं लिंक अद्वितीय है ... – rodrigoelp

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