2010-03-03 16 views
12

मैं एक लिंक शॉर्टिंग सेवा बना रहा हूं और मैं अपने यूआरएल बनाने के लिए एक वृद्धिशील आईडी फ़ील्ड के बेस 64 एन्कोडिंग/डिकोडिंग का उपयोग कर रहा हूं। आईडी "6" के साथ एक यूआरएल होगा: http://mysite.com/Ng==यूआरएल शॉर्टनर: सर्वश्रेष्ठ एन्कोडिंग विधि?

मैं भी उन की तरह http://mysite.com/music

एक कस्टम यूआरएल नाम बनाने के लिए, की अनुमति देनी होगी यहाँ मेरी (संभवतः दोषपूर्ण) दृष्टिकोण अब तक है। फिक्सिंग में मदद की सराहना की जाएगी।

जब कोई एक नई कड़ी बनाता है:

  • मैं डेटाबेस से सबसे बड़ा लिंक आईडी प्राप्त
  • वृद्धि 1
  • द्वारा आईडी छोटे URL कोड जेनरेट करें (http://website.com/[short (यह वृद्धि ऑटो नहीं है) यूआरएल नाम]) लिंक तालिका में है कि आईडी base64_encoding
  • सम्मिलित द्वारा: आईडी, short_url_code, DESTINATION_URL

जब कोई एक नया लिंक बनाता है और एक कस्टम छोटे URL गुजरता है:

  • मेरे योजना अपने कस्टम स्ट्रिंग base64_decode और प्रयोग है कि लिंक आईडी के रूप में किया गया था, लेकिन मुझे नहीं पता था कि आप न सिर्फ base64_decode किसी भी अल्फान्यूमेरिक कर सकते हैं स्ट्रिंग और इसे एक संख्या में बदल दें।

वहाँ एक बेहतर एन्कोडिंग विधि मुझे एक छोटी स्ट्रिंग में किसी भी संख्या बारी देंगे, और एक संख्या में कोई भी स्ट्रिंग है, तो मैं हमेशा छोटे यूआरएल देखने कर सकते हैं (चाहे कस्टम या स्वत: जनरेट की) एक में नाम बदल कर उस नंबर के बराबर आईडी वाले लिंक के लिए नंबर और पूछताछ?

+0

यह भी देखें http://stackoverflow.com/questions/561486/how-to-convert-an-integer-to-the-shortest-url-safe-string-in-python re। यूआरएल – vladr

उत्तर

11

सबसे पहले, सुनिश्चित करें कि आप ID और short_url_code स्तंभों पर जगह में Unicity की कमी करने वाली हो।

जब कोई एक नई कड़ी बनाता है:

  1. डेटाबेस से अगला सबसे बड़ा लिंक ID (प्रदर्शन कारणों से तुम सच में वास्तव में उपयोग करना चाहिए जाओ autoincrement या SEQUENCE, क्या आपके आरडीबीएमएस प्रदान करता है पर निर्भर करता है, अन्यथा जाना आगे और चुनें MAX(ID)+1)
  2. base64_encode या किसी भी अन्य कस्टम या मानक एन्कोडिंग schem का उपयोग कर ID से एक छोटी यूआरएल कोड (http://website.com/[short url name]) उत्पन्न ई
  3. links तालिका में
  4. सम्मिलित: ID, short_url_code, destination_url
  5. डालने की कोई समस्या उल्लंघन के कारण विफल रहता है चरण 1 पर एक नया ID कोशिश करने के लिए वापस जाने के लिए; हो सकता है कि आपने उल्लंघन किया हो क्योंकि:

    1. एक ही आईडी पहले से ही किसी अन्य थ्रेड/प्रक्रिया आदि द्वारा समानांतर में उपयोग किया जा चुका है (यानी डाला गया)।(यदि आप autoincrement या SEQUENCE इस्तेमाल किया इस नहीं क्या होगा, और अक्सर अन्यथा हो सकता है), और/या
    2. ही short_url_code पहले से ही एक कस्टम URL के रूप में इस्तेमाल किया गया है (यह बहुत seldomly जब तक कि कोई कोशिश कर रहा है क्या होगा अपनी साइट पर मुसीबत)
  6. कारण तो डालने सफल रहा, प्रतिबद्ध और उपयोगकर्ता

जब कोई एक नया लिंक बनाता है और एक कस्टम छोटे URL गुजरता है करने के लिए कम URL वापस:

  1. इसके बजाय ऊपर चरण 2 में के रूप में ID से छोटे URL हिस्सा पैदा करने में, जैसा कि ऊपर
  2. एक ही चरण 1 प्रदर्शन करना, कस्टम short_url_code उपयोगकर्ता द्वारा प्रदान का उपयोग
  3. एक ही कदम प्रदर्शन करना
    1. पर एक बाधा उल्लंघन: ऊपर
    2. के रूप में 3 डालने की वजह से विफल रही है, तो: वापस जाने के लिए चरण 1 पर short_url_code पर एक नया ID
    3. एक बाधा उल्लंघन कोशिश करने के लिए: उससे पूछ भिन्न कस्टम URL लेने के लिए उपयोगकर्ता के लिए एक त्रुटि वापसी, लघु यूआरएल वह/वह प्रदान की पहले से ही इस्तेमाल किया गया है
    4. के रूप में
  4. ऊपर
+0

धन्यवाद बेस में बेस 64 एन्कोडिंग। मुझे यह उल्लेख करना चाहिए था कि मैं पहले ही बाधा उल्लंघन का सामना कर रहा था। मैंने बेस 32 पर स्विच किया है जो मुझे एक कस्टम यूआरएल को एक नंबर में बदलने देता है और आईडी के रूप में डालने देता है। यह आसान बनाता है क्योंकि मुझे केवल प्राथमिक कुंजी के रूप में आईडी होना है। यदि कस्टम नाम के बेस 32 प्रतिनिधित्व के लिए बाधा उल्लंघन है तो यह उन्हें बताता है कि नाम पहले ही लिया जा चुका है। यदि एक गैर-कस्टम यूआरएल के लिए बाधा उल्लंघन है, तो यह आईडी को तब तक बढ़ाता रहता है जब तक वह सम्मिलित न हो जाए। क्या यह एक सभ्य समाधान की तरह लगता है? – makeee

+0

इस बात पर निर्भर करता है कि आप किस व्यापार के लिए तैयार हैं; अधिकांश डेटाबेस देशी 'int' प्रकार 64 बिट लंबे ('bigint' या समकक्ष प्रकार) पर हैं, जिसका अर्थ है कि यदि मैं आपको एक कस्टम लघु URL प्रदान करता हूं जो 64/5 = 12 (5 = लॉग 2 (32) से अधिक है) पात्र आप मुझे समायोजित करने में सक्षम नहीं होंगे। क्या यह स्वीकार्य होगा कि उपयोगकर्ताओं को 12 वर्णों से अधिक कस्टम URL प्रदान करने की अनुमति न दें? – vladr

+0

अच्छा बिंदु। मुझे 12 से अधिक वर्णों की आवश्यकता है। इसके बारे में: लिंक बनाते समय, यदि कस्टम नाम 12 वर्णों से अधिक है तो मैं केवल अगली सबसे बड़ी आईडी (कस्टम नाम लिंक के आईडी को छोड़कर) का उपयोग करता हूं। यदि यह 12 वर्णों से कम है तो मैं आईडी में कस्टम नाम एन्कोड करता हूं। फिर जब उसके संक्षिप्त नाम से एक लिंक देख रहे हों, तो वह आईडी डीबी में नहीं मिलती है जिसका मतलब है कि यह 12 से अधिक वर्ण था, इसलिए मैं इसे अपने छोटे नाम से देखता हूं। – makeee

2

बेस 64 लघु यूआरएल बनाने के लिए इस्तेमाल किया जा सकता के रूप में ही चरण 5 प्रदर्शन, लेकिन यह भी यूआरएल लंबे समय तक कर सकते हैं। उदाहरण के लिए नंबर 1 का base64_encode 'MQ ==' है जो आकार के 4 गुणा है। बेस 64 में 64 बिट्स प्राप्त करने के लिए हमेशा 2 अक्षर होंगे, जो छोटे यूआरएल के लिए आदर्श नहीं है।

यदि आकार सबसे महत्वपूर्ण कारक है तो आप internationalization पर निर्भर करके सबसे कम यूआरएल उत्पन्न करने में सक्षम हो सकते हैं।

यह एक यूआरआई बल्कि लंबे समय तक (ऊपर एक भी यूनिकोड वर्ण के लिए 9 ASCII वर्ण को) कर सकते हैं, लेकिन ऐसा इरादा था कि ब्राउज़रों केवल डीकोड प्रपत्र प्रदर्शित करने के लिए की जरूरत है, और कई प्रोटोकॉल के बिना UTF-8 भेज सकते हैं % एचएच भागने।

ध्यान रखें कि ब्राउज़र को UTF-8 के साथ काफी अच्छी तरह से काम रखें, और चहचहाना इन url के साथ कोई परेशानी नहीं होगी।

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