Алгоритм для создания уникального (постоянного) кода для строки, которая должна быть обратимой

Требование:

У нас есть значения в DB, ​​например

Chennai
Baroda
Bangalore
New Delhi
São Paulo, Lisboa
San Jose

и т.д...

Итак, я хочу преобразовать эту строку в уникальную короткую строку. Например

Chennai –> xy67kr

San Jose –> iuj73d

в основном что-то похожее на URL shortner.

И алгоритм для его преобразования должен быть обратимым. Т.е. когда я передаю "xy67kr" функции декодирования, он должен вернуть мне "Ченнай".

Ожидаем помощи.

Ответ 1

Как утверждают другие плакаты, у вас не может быть функции, которая сокращает произвольные строки, что математически невозможно. Но вы можете создать настраиваемую функцию, которая хорошо работает с вашим конкретным набором строк.

Примерный подход - это вычислить частоту символов в наборе, а затем просто закодировать символы с префиксным кодом, чтобы наиболее частые буквы кодируются короткими префиксами (т.е. кодировка Хаффмана.)

В приведенном выше подходе не используется тот факт, что на естественном языке следующий символ может быть достаточно точно предсказан из предыдущих, поэтому вы можете расширить алгоритм выше, чтобы вместо кодирования символов независимо он кодировал следующий символ в n-грамме. Для этого, конечно, требуется более высокая таблица сжатия, чем простой подход, поскольку у вас фактически есть отдельный код в зависимости от префикса. Например, если "e" очень часто после "th", то "e" после "th" кодируется очень коротким префиксом. Если "e" очень нечетко после "ee", тогда он может быть закодирован с очень длинным префиксом в этом случае. Алгоритм декодирования, очевидно, должен смотреть на декомпрессированный префикс, чтобы проверить, как декодировать следующий символ.

Этот общий подход предполагает, что частоты не изменяются или, по крайней мере, медленно меняются. Если ваш набор данных изменился, то вам придется перекомпилировать статистику и перекодировать строки.

Ответ 2

Посмотрите мой ответ на аналогичный вопрос и просто перепишите его на PHP:

Кодировка:

$encoded = base64_encode(gzdeflate("São Paulo, Lisboa"))

Декодирование:

$decoded = gzinflate(base64_decode($encoded))

Обратите внимание, что gzdeflate работает более коротко, чем gzcompress.

Но в любом случае проблема заключается в том, что для коротких строк длина строки больше. Это лучше работает на более длинных текстах. Конечно, было бы лучше использовать некоторый алгоритм сжатия с априорной информацией, такой как ppm или метод суффикса с начальным деревом суффикса... тогда он отлично работал бы и на коротких строках.

Ответ 3

Вы не можете сократить длины строк длины до фиксированной длины.

Что вы можете сделать, так это создать эти короткие строки для уникального идентификатора строки этой конкретной строки в базе данных. Вот несколько советов: Как создать последовательную хэш-функцию.

Ответ 4

Это не обязательно детерминировано, но, очевидно, вы можете использовать таблицу поиска. Служба будет похожа на goo.gl или imgur