Уведомления

Группа в Telegram: @pythonsu

#1 Май 17, 2018 17:18:30

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Закодировать число в виде строки

В веб-приложении используются ссылки, содержащие id юзера, хотелось бы сделать эти ссылки не просто по айдишнику, а скрыть его за какой-то строкой. Дело не в безопасности, просто из эстетических соображений - чтобы пользователь айдишник не видел ну и вообще солиднее выглядела ссылка.
То есть нужны две функции, способные айдишник в виде int перевести в строку и обратно:
encode: 32 => 3dhRf2nmj
decode: 3dhRf2nmj => 32
hash и hashlib не подходят, т.к. нет декодирования.
django.core.signing.Signer возвращает строку, содержащую перед двоеточием айдишник, тоже не то.
Самые простые решения, найденные гуглением, выглядят примерно так. Может, есть что покороче?
Или проще сделать столбец uuid и его вставлять в url?

Офлайн

#2 Май 17, 2018 18:39:50

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Закодировать число в виде строки

все что передается по сети - байты и говорить об 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}
>>> 

Офлайн

#3 Май 17, 2018 19:16:54

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Закодировать число в виде строки

Слишком длинная ссылка получится.
Тогда проще свою таблицу перевода запилить. Просто странно, что нет готового решения, задача-то простая.

Офлайн

#4 Май 17, 2018 20:45:03

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Закодировать число в виде строки

скорей всего никому не надо. да и что мешает ключи сгенерить?

 >>> 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)

Офлайн

#5 Май 18, 2018 01:20:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Закодировать число в виде строки

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)

Офлайн

#6 Май 18, 2018 11:16:28

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Закодировать число в виде строки

Так и сделаю. Всем спасибо.

Офлайн

#7 Май 18, 2018 12:21:53

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Закодировать число в виде строки

Обычно для такого base64 используют.

 >>> import base64
>>> base64.encodestring("100")
'MTAw\n'
>>> s = base64.encodestring("100")
>>> base64.decodestring(s)
'100'



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version