Найти - Пользователи
Полная версия: Закодировать число в виде строки
Начало » Python для новичков » Закодировать число в виде строки
1
Elaphe
В веб-приложении используются ссылки, содержащие id юзера, хотелось бы сделать эти ссылки не просто по айдишнику, а скрыть его за какой-то строкой. Дело не в безопасности, просто из эстетических соображений - чтобы пользователь айдишник не видел ну и вообще солиднее выглядела ссылка.
То есть нужны две функции, способные айдишник в виде int перевести в строку и обратно:
encode: 32 => 3dhRf2nmj
decode: 3dhRf2nmj => 32
hash и hashlib не подходят, т.к. нет декодирования.
django.core.signing.Signer возвращает строку, содержащую перед двоеточием айдишник, тоже не то.
Самые простые решения, найденные гуглением, выглядят примерно так. Может, есть что покороче?
Или проще сделать столбец uuid и его вставлять в url?
vic57
все что передается по сети - байты и говорить об 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}
>>> 
Elaphe
Слишком длинная ссылка получится.
Тогда проще свою таблицу перевода запилить. Просто странно, что нет готового решения, задача-то простая.
vic57
скорей всего никому не надо. да и что мешает ключи сгенерить?
 >>> 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}
py.user.next
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'}
>>>
Если словесные длины зафиксируешь, то можно будет брать по два символа и отыскивать их в словаре пар (слово, цифра). Если словесные длины не зафиксируешь, надо будет накапливать слово и после каждого нового символа искать слово в словаре.

У цифр длина последовательности символов всегда равна единице. У слов длина последовательности символов в данном случае равна двум (это для удобства обратного преобразования сделано). Можно длину слов варьировать, тогда трансляция из слова в цифру просто немного усложнится алгоритмически.
Elaphe
Так и сделаю. Всем спасибо.
Rodegast
Обычно для такого base64 используют.
 >>> import base64
>>> base64.encodestring("100")
'MTAw\n'
>>> s = base64.encodestring("100")
>>> base64.decodestring(s)
'100'
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB