Форум сайта python.su
В веб-приложении используются ссылки, содержащие id юзера, хотелось бы сделать эти ссылки не просто по айдишнику, а скрыть его за какой-то строкой. Дело не в безопасности, просто из эстетических соображений - чтобы пользователь айдишник не видел ну и вообще солиднее выглядела ссылка.
То есть нужны две функции, способные айдишник в виде int перевести в строку и обратно:
encode: 32 => 3dhRf2nmj
decode: 3dhRf2nmj => 32
hash и hashlib не подходят, т.к. нет декодирования.
django.core.signing.Signer возвращает строку, содержащую перед двоеточием айдишник, тоже не то.
Самые простые решения, найденные гуглением, выглядят примерно так. Может, есть что покороче?
Или проще сделать столбец uuid и его вставлять в url?
Офлайн
все что передается по сети - байты и говорить об int - смысла нет
функций таких миллион можно написать, например словарь использовать
>>> from hashlib import md5 >>> d = {} >>> for i in range(1,5): key = md5(str(i).encode()).hexdigest() d[key] = i >>> d {'c4ca4238a0b923820dcc509a6f75849b': 1, 'c81e728d9d4c2f636f067f89cc14862c': 2, 'eccbc87e4b5ce2fe28308fd9f2a7baf3': 3, 'a87ff679a2f3e71d9181a67b7542122c': 4} >>>
Офлайн
Слишком длинная ссылка получится.
Тогда проще свою таблицу перевода запилить. Просто странно, что нет готового решения, задача-то простая.
Офлайн
скорей всего никому не надо. да и что мешает ключи сгенерить?
>>> from random import sample >>> l = 'qwerty0987654321' >>> d = [{''.join(sample(l,8)):i} for i in range(10)] >>> d [{'798et134': 0}, {'w4850t93': 1}, {'w9e18r52': 2}, {'3692ry87': 3}, {'r345268t': 4}, {'02471q86': 5}, {'37ry8524': 6}, {'50qr7849': 7}, {'260t497e': 8}, {'e298q6ry': 9}] >>> >>> d = {''.join(sample(l,6)):i for i in range(10)} >>> d {'1rqe47': 0, 'w6q5ty': 1, '15480r': 2, '02y9qw': 3, '80rw16': 4, '7398y4': 5, '7wyr1t': 6, '094y1r': 7, '51ey76': 8, '02tqr3': 9}
Отредактировано vic57 (Май 17, 2018 20:49:29)
Офлайн
ElapheПростой маппинг по словарю туда и обратно подойдёт. Фиксированные цифры в фиксированные последовательности букв.
То есть нужны две функции, способные айдишник в виде int перевести в строку и обратно:
encode: 32 => 3dhRf2nmj
decode: 3dhRf2nmj => 32
>>> dw = {'1': 'ab', '2': 'xr'} >>> wd = {v: k for k, v in dw.items()} >>> >>> dw {'1': 'ab', '2': 'xr'} >>> wd {'ab': '1', 'xr': '2'} >>>
Отредактировано py.user.next (Май 18, 2018 01:30:14)
Офлайн
Так и сделаю. Всем спасибо.
Офлайн
Обычно для такого base64 используют.
>>> import base64 >>> base64.encodestring("100") 'MTAw\n' >>> s = base64.encodestring("100") >>> base64.decodestring(s) '100'
Офлайн