Привет всем!
Вот такая странная идея пришла мне в голову во время сидения на ГЭКе. Точнее, там пришла несколько иная, но потом я ее додумал и вышло вот это. Может, конечно, это велосипед, но что-то я реализаций его не встречал. Если они есть — сорри.
В HTML , e-mail и т.д. пересылается текст на русском языке. Этот текст пересылается как набор номеров букв. На букву — один байт (или 2, если юникод).
А что, если вместо этого пронумеровать
слова русского языка и пересылать их номера ? Конечно, для этого на сервере должен быть шифрующий модуль и словарь, а на клиенте — тот же словарь и дешифратор.
Попробуем оценить, что это даст. Исследование
http://www.ruthenia.ru/folklore/ls04_petrova1.htm
говорит,
"Словарная средняя длина слова (согласно словарям Даля и Ожегова) составляет 6-7 звуков". Ладно, пусть 6, тем более, что звук и буква не одно и то же.
Будем считать слова различными, если они отличаются хотя бы одним символом. Так что все падежные формы и склонения — это разные слова.
Если слово нумеровать 2 байтами, то мы можем иметь 65 тыс. слов. Этого, конечно, мало для полного словаря.
Если взять 2.5 байта — миллион слов. Этого, я думаю, хватит.
Впрочем, можно и 2 байтами обойтись. Пронумеруем только самые часто встречающиеся слова. Оставшиеся будем передавать как есть, без изменений, что придется делать крайне редко. Никто не мешает передавать смесь кодированного и некодированного текста. Какой-нибудь префикс кодировки ввести (нулевое слово , к примеру), оно же и префикс окончания кодировки. Парсер разберется.
Если исходить из 2-байтной кодировки, то вместо 6 букв (6 или 12 байтов) имеем только 2 байта. Экономия в 3 (6) раз(а).
Кстати, если кодировать все слова без исключения (т.е 2.5 байта), то исчезает понятие кодовой страницы. Передаются просто номера слов. Как их потом буквами записать — дело клиента.
Вполне можно и английский текст также кодировать, если он на русских страницах встречается. Еще один префикс — переключение на английский (и обратно). Конечно, тогда нужен и английский словарь.
Все, что кодировать не удастся (теги HTML и т.д., слова на латыни или на японском
) — слать как обычно. Парсер разберется.
Сам словарь большим не будет. Если даже миллион слов со средней длиной 6 букв — 6 Мб плюс накладные расходы. Мелочь. В конце концов, у многих есть на компьютере англо-русский/русско-английский словарь. Почему бы не быть еще число-русскому/русско-численному ? Да и ставится он один раз и чуть ли не навсегда
.
Время кодировки — log(N), где N — число слов, если использовать дерево. Время декодировки — O(1), просто взять по индексу.
Реализовать это можно вообще прозрачно для приложений. Сервер (HTTP или Mail) на выходе кодирует. Клиент (броузер или почтовый) на входе декодирует. Никакое приложение ничего и не узнает. Но для этого, конечно, надо в сервер и клиент изменения вносить.
Или можно реализовать в приложениях. Выходной фильтр на сервере и что-то в стиле AJAX на клиенте.
Жду комментариев.