ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не спрашиваю, как сократить URL-адрес (я уже реализовал найденный ответ «биективная функция» ЗДЕСЬ , использующий строку в кодировке base-62). Вместо этого я хочу расширить эту реализацию, чтобы запутать сгенерированную строку, чтобы она выглядела как
A) не легко угадываемая последовательность , а
B) все еще биективен.
Вы можете легко рандомизировать свой набор символов base-62, но проблема в том, что он все еще увеличивается, как и любое другое число в любой другой базе. Например, одна из возможных последовательных последовательностей может быть {aX9fgE, aX9fg3, aX9fgf, aX9fgR, … ,}
Я придумала технику запутывания, которой я доволен с точки зрения требования A) , но я лишь частично уверена, что она удовлетворяет B) . Идея такова:
Единственное, что гарантированно изменится в инкрементальном подходе, это "1-е место" (я буду использовать десятичную терминологию по соображениям практичности). В приведенном выше примере последовательности это будет {E, 3, f, R, …}
. Поэтому, если каждый символ в наборе base-62 имеет свой уникальный номер смещения (скажем, его расстояние от «нулевого символа»), то вы можете применить смещение символа «1 место» к остальной части строки.
Например, допустим, набор base-5 с символами {A, f, 9, p, Z, 3}
(в порядке возрастания от 0 до 5). Каждый из них будет иметь уникальное смещение от 0 до 5 соответственно. Подсчет будет выглядеть как {A, f, 9, p, Z, 3, fA, ff, f9, fp, …}
и так далее. Таким образом, алгоритм, когда ему присваивается значение fZ3p
, будет смотреть на p
и, имея смещение +3, переставит строку в Zf9p
(предполагая, что набор base-5 представляет собой круговой массив). Следующим инкрементным числом будет fZ3Z
, а при смещении Z
, равном +4, алгоритм возвращает 39pZ
. Эти переставленные результаты будут переданы пользователю в качестве его / ее «уникального URL», который никогда не увидит фактическую base-62 строку в кодировке.
Этот подход, безусловно, кажется обратимым; просто посмотрите на последний символ и выполните ту же перестановку с отрицательным смещением. И я думаю, что по этой причине он все еще должен быть биективным. Но я не знаю, верно ли это ? Есть ли какие-либо крайние / угловые случаи, которые я не рассматриваю?
РЕДАКТИРОВАТЬ: Мои намерения в большей степени ориентированы на длину сокращенного URL, чем на безопасность шаблона. Я понимаю, что существует множество решений, включающих криптографические функции, блочные шифры и т. Д. Но я хотел бы подчеркнуть, что я не спрашиваю лучший способ достижения A) , а скорее, « - мой подход смещения, удовлетворяющий B) ».
Будем благодарны за любые найденные дыры.