URL shortener

Discussion in 'Python' started by FK-, 4 May 2019.

  1. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    12
    Reputations:
    0
    Хочу сделать укорачиватель ссылок. Делаю на Python + Flask. С представительской частью проблем нет. Но вот с логикой есть.
    Я сейчас ищу материал о самом преобразовании длинной ссылки в короткую.
    Мои представления об этом
    1) Получить сслыку (проблем нет)
    2) Сгенерировать короткую версию (ПРОБЛЕМА)
    3) Проверить наличие в БД (проблем нет)
    4) Если нет - записать (проблем нет)
    5) Отдать юзеру (проблем быть не должно)

    Подскажите плез алгоритмы генерации коротких версий ссылки.
     
  2. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    138
    Reputations:
    4
    не очень понятно что именно ты пытаешься сделать . если я правильно понял то сгеренировать короткую ссылку можно захешировав ее например в md5 . и потом брать из базы по хешу настоящую и подставлять ее. только вот зачем это все не очень пойму.
    но md5 это однонаправленное шифрование. если надо именно короткую отдавать то стоит посмотреть двунаправленные алгоритмы шифрования. насколько короткие хеши они генерируют.
    и расшифровывать потом на клиенте. только посмотреть насколько короткие хеши у них
    вот например js либа. шифруешь на питоне . разсшифровываешь на js. это если надо отдавать короткую. или например можно переписать все переходы по ссылкам с сайта и перенаправить их на твой обработчик который будет находить уже нужную ссылку и отправлять на нее.

    https://gist.github.com/jo/8619441
     
    #2 barnaki, 5 May 2019
    Last edited: 5 May 2019
  3. Игорь

    Игорь Member

    Joined:
    5 Sep 2006
    Messages:
    39
    Likes Received:
    14
    Reputations:
    0
    ID в базе + несколько символов, чтобы не подбирали
    id возможно в hex перегнать или еще какую-то систему исчесление > 10, тоже получим короткий результат
     
  4. lapitsky

    lapitsky New Member

    Joined:
    21 Feb 2012
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    2) гугли хеширование
    - сделать преобразование ссылки по хешу, причем хеш не должен быть криптостойкий, поэтому длина хеша может быть 3-6 символов, то есть на выходе ссылка будет например yousite.ru/5zfdsw.
    - защита от совпадения хешей, простая проверка в базе по наличию схожей и последующему хешированию еще раз
    - для быстрой работы, база должна быть именно key:value хранилище
     
  5. Mexel

    Mexel Member

    Joined:
    22 Nov 2016
    Messages:
    36
    Likes Received:
    39
    Reputations:
    3
    Code:
    import hashlib
    import time
    
    forEncode = ''.join('https://forum.antichat.ru/', str(time.time()))
    # Солю поступившие данные (URL), дабы хэши не повторялись
    
    encodeUrl = hashlib.md5(forEncode.encode('utf-8')).hexdigest()
    # Хэширую в md5
    
    shortUrl = encodeUrl[:5]
    # Сохраняю первые 5 символов
    Дальше пиздуешь настраивать регулярку в конфигах, которая должна вызывать функцию обрабатывающую запрос на редирект, регулярка будет иметь логику *пять символов входящих в 0-9,a-z,A-Z*

    И не забудь, что есть такие урл на приложухи, как ftp://, tg://, ...
    Так что не зацикливайся на протоколе http/s, а бери в оборот и это
     
    4Fun and FK- like this.
  6. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    12
    Reputations:
    0
    Принял, спасибо)
     
  7. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    12
    Reputations:
    0
    #colorblind likes this.
  8. Mexel

    Mexel Member

    Joined:
    22 Nov 2016
    Messages:
    36
    Likes Received:
    39
    Reputations:
    3
    Ты меня тогда заинтересовал, тоже сделал xD, только чуть пошустрее и на джанге

    Чекнул твой код, много лишнего, не забывай что наткнувшись на первый return, выполнение последующего кода - прерывается. Отправил пулл реквест.
     
    #8 Mexel, 22 Aug 2019
    Last edited: 25 Jan 2023
    FK- and #colorblind like this.
  9. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    12
    Reputations:
    0
    Нууу, я писал примерно неделю и в течении обучения. Да и начинал где то в начале июля. Когда появилась первая адекватная версия - выложил на гитхаб. А потом начал разбираться с API :D
    Спасибо за замечание. Я был бы очень благодарен, если бы весь мой код кто-то проверял) Надеюсь, что скоро устроюсь джуном.

    Ну а насчёт моего стиля, если он показался не очень - у меня есть привычка четко определять условия.
    По поводу return'ов - чекну от и до всю логику (всм routes.py), спасибо :)

    Ну а по поводу Джанги - мне после Фласка не понравилось. Мне кажется, что там слишком много всего. Я не хотел бы затачивать знания языка под один конкретный фреймворк, но пока что Фласк горячо любим, а Джанга не понят.

    Ещё раз спасибо за ревью :)
     
  10. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    12
    Reputations:
    0
    А что скажешь по поводу API ?