Возникла задача склеить два шестизначных числовых кода и записать их в один шестизначный код типа строка. О практическом применении напишу ниже.
Решение:
Выложим последовательность букв в ряд, например по алфавиту:
Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";
У каждой буквы есть порядковый номер: А = 1, Б = 2, В = 3 …, Ю = 32, Я = 33.
Если после прохождения всех номеров добавлять разрядность и продолжать нумерацию то получим: АА = 34, АБ = 35, АВ = 36 … ААА = 1123, ААБ = 1124 ,...
Таким образом, буквенный ряд, как и числовой, будет бесконечным.
Из этого следует, что каждому числу соответствует одна комбинация букв нашего буквенного ряда, но при этом разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10.
Это похоже на запись числа в шестнадцатеричном виде, но алгоритм немного другой и разрядов больше :)
Соответственно чем больше знаков в исходном буквенном ряде, тем меньше знаков потребуется для кодирования числа. Например, если составить ряд из букв верхнего и нижнего регистра русского и латинского алфавитов + цифры от 1 до 9 (ноль не используется) то длина его будет 127 символов.
Использем этот ряд для преобразование числа 999 999 999 999 в строку, получим значение 48AшяC
т.е. 12-ти значное число можем "свернуть" в 6-ти символьную строку.
Механизм по обратному преобразованию можно использовать не только для определения первоначального числа.
Например используя в качастве буквенного ряда алфавит, можно получить порядковый номер любого слова, этот номер постоянный и не может изменится. т.к. алфавит не меняется.
так слово КЛАССИФИКАТОР будет иметь номер 20674162138069284621
а слово АЛГОРИТМ номер 59583701312
Кроме того, добавив в буквенный ряд заглавные буквы, знаки препинания и пробел, можно получать номера целых предложений например:
Без труда не выловишь и рыбку из пруда. = 19470269484383031306224885067323003470882054702807657091899034219691830
Теперь по реализации преобразования:
Немного математики и получаем механизмы перевода значения числа в строку и обратно используя собственный буквенный ряд.
&НаКлиенте
Процедура Выполнить2(Команда)
//Из числа в строку
Алфавит2 = Объект.Алфавит2;
КолСимволов = СтрДлина(Алфавит2);
Сл = "";
Ч = Число(?(ЗначениеЗаполнено(СокрЛП(Объект.Строка2)),СокрЛП(Объект.Строка2),0));
Пока Ч > КолСимволов Цикл
цел = Цел(Ч/КолСимволов);
дроб = (Ч/КолСимволов)-цел;
Если дроб = 0 Тогда
НомерБуквы = КолСимволов;
Ч = цел-1;
Иначе
НомерБуквы = дроб*КолСимволов;
Ч = цел;
КонецЕсли;
Сл = Сред(Алфавит2, Окр(НомерБуквы),1) + Сл;
КонецЦикла;
Если Ч > 0 Тогда
Сл = Сред(Алфавит2,Ч,1)+Сл;
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст =Строка(Сл);
Сообщение.Сообщить();
// Из строки в число
Ч = 0;
ДлСтроки = СтрДлина(СокрЛП(Объект.Строка));
Для А = 1 По ДлСтроки Цикл Ч = Ч+Pow(КолСимволов,ДлСтроки-А)*Найти(Алфавит2,Сред(СокрЛП(Объект.Строка),А,1)) КонецЦикла;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст =Строка(Ч);
Сообщение.Сообщить();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Объект.Алфавит2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя";
КонецПроцедуры
Способы применения:
- Использование максимального диапазона допустимых символов внутри установленной длинны кода.
- Визуальное кодирование и декодирование текста.
- Получение уникального идентификатора приемлемой длинны по нескольким элементам имеющим числовой код.
- Изменяя строку Алфавит2 (набор и последовательность символов), можно установить уникальную кодировку.
- Поместить строку в реквизит числового типа
- Генерировать строковые пароли
- Использовать как классификатор всех слов
- ...
Также можно подумать на счет хранения закодированного пароля в обычном реквизите типа число, при этом ключ надежно прятать :) может быть актульно для 7.7
Примеры преобразований:
_____________________________________________________________
число 22123476457584895786769029890898078978678123452153427867862146576367721919322327877721010111775763535555548388
строка рrюгщRPtpzWfнrYТHp1TЬйlЕldVdЙЛэCВщПzqJXлГэНZpmВeJяЧd
_______________________________________________________
строка ЕслиМеханизмИнтересенНажмитеПлюс
число 11214047979048599474046065949637649393355959347429435025149026973969
число 781060657266302177787942157125453912674901582490 (только русский алфавит нижний регистр, 33 знака)
______________________________________________________________