मैं एक ऑनलाइन दस्तावेज़ पढ़ रहा हूँ जो बताता है कि url शॉर्टिंग सेवा को कैसे डिज़ाइन किया जाए। वेबसाइट है https://www.educative.io/courses/grokking -द-सिस्टम-डिज़ाइन-साक्षात्कार

अनुभाग में, वास्तविक URL एन्कोडिंग, उन्होंने कहा -> "हम दिए गए URL के एक अद्वितीय हैश (जैसे, MD5 या SHA256, आदि) की गणना कर सकते हैं। हैश को प्रदर्शित करने के लिए एन्कोड किया जा सकता है। यह एन्कोडिंग बेस 36 ([ az ,0-9]) या बेस62 ([AZ, az, 0-9]) और अगर हम '+' और '/' जोड़ते हैं तो हम बेस 64 एन्कोडिंग का उपयोग कर सकते हैं। एक उचित प्रश्न होगा, की लंबाई क्या होनी चाहिए लघु कुंजी? 6, 8, या 10 वर्ण।"

"यदि हम अपने हैश फ़ंक्शन के रूप में MD5 एल्गोरिथ्म का उपयोग करते हैं, तो यह 128-बिट हैश मान उत्पन्न करेगा। बेस 64 एन्कोडिंग के बाद, हमें 21 से अधिक वर्णों वाली एक स्ट्रिंग मिलेगी (चूंकि प्रत्येक बेस 64 वर्ण हैश मान के 6 बिट्स को एन्कोड करता है) )।चूंकि हमारे पास केवल 8 वर्णों के लिए जगह है, तो हम अपनी कुंजी कैसे चुनेंगे? हम कुंजी के लिए पहले 6 (या 8) अक्षर ले सकते हैं। इसके परिणामस्वरूप कुंजी दोहराव हो सकता है, इसे हल करने के लिए, हम कर सकते हैं एन्कोडिंग स्ट्रिंग में से कुछ अन्य वर्ण चुनें या कुछ वर्णों को स्वैप करें।"

मैंने ऑनलाइन MD5 हैश जनरेटर (http://onlinemd5.com/) और बेस 64 एनकोडर (https://www.base64encode.org/) उपरोक्त को सत्यापित करने के लिए। मैंने MD5 हैश के लिए इनपुट स्ट्रिंग के रूप में "www.yahoo.com" का उपयोग किया और आउटपुट 1B03577ED104F16AADC00A639D33CB44 है। फिर मैं बेस 64 ने इसे एन्कोड किया और MUIwMzU3N0VEMTA0RjE2QUFEQzAwQTYzOUQzM0NCNDQ = UTF-8 गंतव्य वर्णसेट और यूनिक्स न्यूलाइन सेपरेटर के साथ मिला।

क्या कोई समझा सकता है कि मैं इसे सही तरीके से कर रहा हूं? मैं देखता हूं कि पात्रों की संख्या 21 से अधिक है।

1
SBiswas 11 जिंदा 2020, 09:48

2 जवाब

सबसे बढ़िया उत्तर

समस्या यह है कि आप एमडी 5 के आउटपुट को हेक्साडेसिमल अंकों की एक स्ट्रिंग के रूप में उपयोग कर रहे हैं, और उसके बाद उस स्ट्रिंग को बेस 64 एन्कोडिंग कर रहे हैं। बेस 64 एन्कोड करने का कोई कारण नहीं है कि स्ट्रिंग - बेस 64 एन्कोडिंग बाइनरी डेटा के लिए है। आप शायद जो करना चाहते थे वह बेस 64 एमडी 5 हैश का वास्तविक 128-बिट बाइनरी मान है। यहां कुछ पायथन कोड है जो मुझे लगता है कि आप करने की कोशिश कर रहे हैं:

import hashlib, base64

text = "www.yahoo.com"
text_utf8 = text.encode('utf8')
md5 = hashlib.md5(text_utf8).digest()
b64 = base64.b64encode(md5)
print(b64)

यह परिणाम GwNXftEE8WqtwApjnTPLRA प्राप्त करता है जिसकी लंबाई आप अपेक्षा कर रहे थे।

4
Andrew Merrill 11 जिंदा 2020, 07:40

इस पोस्ट ने मुझे TinyUrl design यहां नमूना जावा प्रोग्राम है, अगर कोई इसे ढूंढ रहा है।

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;


public class TinyUrlAlgorithm {
    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        byte[] input = "https://www.educative.io/courses/grokking-the-system-design-interview".getBytes("UTF-8");//args[0].getBytes("UTF-16");//"https://www.educative.io/courses/grokking-the-system-design-interview".getBytes("UTF-8");
        byte[] md5hash = messageDigest.digest(input);
        Base64.Encoder encoder = Base64.getEncoder();
        String encodeToString = encoder.encodeToString(md5hash);
        int shortKeyType =  3;//Integer.parseInt(args[1]);
        String tinyUrlKey = shortKeyType ==1 ? encodeToString.substring(0,6) : shortKeyType == 2 ? encodeToString.substring(0,8) : randomlySelect8Chars(encodeToString);
        System.out.println("ShortKey --> " + tinyUrlKey);

    }

    //Fisher yates algorithm
    private static String randomlySelect8Chars(String encodeToString) {
        Random random = ThreadLocalRandom.current();
        char[] encodedChars =  encodeToString.toCharArray();
        assert encodedChars.length == 21;
        for(int i=20; i >=0; i--) {
            int randomIndex =  random.nextInt(i+1);
            swap(encodedChars,randomIndex,i);
        }

        return new String(encodedChars,0,8);
    }

    private static void swap(char[] chars, int i, int j) {
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
}
0
bp4D 22 अप्रैल 2021, 19:54