Разработка службы сокращения URL-адресов, такой как TinyURL - PullRequest
0 голосов
/ 11 января 2020

Я читаю онлайн-документ, который объясняет, как разработать сервис сокращения URL-адресов. Веб-сайт https://www.educative.io/courses/grokking-the-system-design-interview.

В разделе «Кодирование реального URL» они сказали -> «Мы можем вычислить уникальный га sh (например, MD5 или SHA256 и т. Д. c.) Данного URL. Ха sh затем можно закодировать для отображения. Это может быть base36 ([az, 0-9]) или base62 ([AZ, az, 0-9]), и если мы добавим «+» и «/», мы можем использовать Base64 Кодирование. Резонный вопрос: какой длины должна быть короткая клавиша? 6, 8 или 10 символов. "

" Если мы используем алгоритм MD5 в качестве нашей функции ha sh, она ' создаст 128-битное значение ha sh. После кодирования base64 мы получим строку, содержащую более 21 символа (поскольку каждый символ base64 кодирует 6 битов значения ha sh). Так как у нас есть место только для 8 символов на короткую клавишу, как тогда мы выберем наш ключ? Мы можем взять первые 6 (или 8) букв для ключа. Это может привести к дублированию ключа, чтобы разрешить это, мы можем выбрать некоторые другие символы из кодировки строка или замена некоторых символов. "

Я использовал онлайн генератор MD5 ha sh (http://onlinemd5.com/) и кодировщик Base64 (https://www.base64encode.org/) для проверки вышеуказанного. Я использовал "www.yahoo.com" в качестве входной строки для MD5 га sh, и на выходе было 1B03577ED104F16AADC00A639D33CB44. Тогда я Base64 закодировал его и получил MUIwMzU3N0VEMTA0RjE2QUFEQzAwQTYzOUQzM0NCNDQ = с UTF-8 целевой кодировкой и Unix разделителем новой строки.

Может кто-нибудь объяснить, правильно ли я делаю? Я вижу, что количество символов больше 21.

1 Ответ

2 голосов
/ 11 января 2020

Проблема в том, что вы используете вывод MD5 в виде строки шестнадцатеричных цифр, а затем base64, кодирующую эту строку. Нет оснований для кодирования base64 этой строки - кодировка base64 предназначена для двоичных данных. То, что вы, вероятно, хотели сделать, это base64 фактическое 128-битное двоичное значение MD5 га sh. Вот код Python, который делает то, что, я думаю, вы пытаетесь сделать:

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 с ожидаемой вами длиной.

...