Имя: Пароль:
1C
 
UUID обычный 36 символов, инверсный 32
0 Suzuki
 
01.02.10
09:56
А как бы его сократить до 25?
1 ДенисЧ
 
01.02.10
09:57
Да сразу до 2х сокращай, чего мелочиться...
2 H A D G E H O G s
 
01.02.10
09:59
Создай свой алфавит!
3 H A D G E H O G s
 
01.02.10
10:03
Вернее нет, преобразую Строку 16-ричную в число и храни его
4 Defender aka LINN
 
01.02.10
10:08
А накукуй?
5 Suzuki
 
01.02.10
10:17
(4) ограничение на длину поля в другой учетной системе, синхронизация по UUID
6 Sammo
 
01.02.10
10:28
Каждые 2 знака преобразуй в 1 символ
7 orefkov
 
01.02.10
10:47
(6)
Не выйдет, ибо это получится бинарный гуид, а надо строку.
Вот 3 знака в 2 - легко. По сути, это и есть (2)
Вот для примера из 32 в 22 символа (первые 10 троек преобразуем в двойки, и 2 оставшихся символа)

Функция Из16в10(ст)
   рез = 0;
   Для н = 1 По СтрДлина(ст) Цикл
       с = Сред(ст, н, 1);
       рез = рез * 16 + ?(с <="9", КодСимв(с) - КодСимв("0"), 10 + КодСимв(с) - КодСимв("A"));
   КонецЦикла;
   Возврат рез;
КонецФункции    // Из16в10

Функция Из10в16(ч)
   стр = "";
   Если ч = 0 Тогда
       Возврат "0";
   КонецЕсли;
   рез = "";
   с16 = "0123456789ABCDEF";
   Пока ч > 0 Цикл
       рез = Сред(с16, 1 + (ч % 16), 1) + рез;
       ч = Цел(ч / 16);
   КонецЦикла;
   Возврат рез;
КонецФункции    // Из10в16

Функция Гуид32в22(Знач стр32гуид)
   стр32гуид = Врег(стр32гуид);
   стр = "";
   Для Номер = 0 По 9 Цикл
       ч = Из16в10(Сред(стр32гуид, 1 + Номер * 3, 3));
       стр = стр + КодСимв(33 + Цел(ч / 64)) + КодСимв(33 + (ч % 64));
   КонецЦикла;
   Возврат стр + Сред(стр32гуид, 31, 2);
КонецФункции    // СвернутьГуид

Функция Гуид22в32(Знач стр22гуид)
   стр = "";
   Для Номер = 0 По 9 Цикл
       ч = (КодСимв(Сред(стр22гуид, 1 + Номер * 2, 1)) - 33) * 64 +
           КодСимв(Сред(стр22гуид, 2 + Номер * 2, 1)) - 33;
       стр = стр + Из10в16(ч);
   КонецЦикла;
   Возврат стр + Сред(стр22гуид, 21, 2);
КонецФункции    // Гуид22в32
8 H A D G E H O G s
 
01.02.10
10:50
(7) Почему 2 символа
FF нельзя заменить числом 255 ?
9 H A D G E H O G s
 
01.02.10
10:51
Или символом
'я'

??
10 H A D G E H O G s
 
01.02.10
10:53
Нууу, насчет символа я погорячился, ибо есть злой
#0, но все же.
11 orefkov
 
01.02.10
10:54
+(7)
Сорри, баг. Вот правильно

Функция Гуид32в22(Знач стр32гуид)
   стр32гуид = Врег(стр32гуид);
   стр = "";
   Для Номер = 0 По 9 Цикл
       ч = Из16в10(Сред(стр32гуид, 1 + Номер * 3, 3));
       стр = стр + Симв(33 + Цел(ч / 64)) + Симв(33 + (ч % 64));
   КонецЦикла;
   Возврат стр + Сред(стр32гуид, 31, 2);
КонецФункции    // СвернутьГуид
12 orefkov
 
01.02.10
10:57
(8)
Два символа в строке гуида - 256 вариантов.
То есть попадут символы от 0 до 31, что не хорошо.
Если сможешь два символа ужать в один и получить читаемую строку - тогда пожаста.
13 H A D G E H O G s
 
01.02.10
11:13
(12)
0..255 = 256 вариантов.
14 H A D G E H O G s
 
01.02.10
11:15
(12) Числом хранить.
15 orefkov
 
01.02.10
11:16
Ну и вот гарантировано сжимает не более чем в 17 символов, в полученной строке нет символов от 0 до 32. Принцип таков: преобразуем гуид в 10ичное число, число записываем по основанию 222.

Функция Из16в10(ст)
   рез = 0;
   Для н = 1 По СтрДлина(ст) Цикл
       с = Сред(ст, н, 1);
       рез = рез * 16 + ?(с <="9", КодСимв(с) - КодСимв("0"), 10 + КодСимв(с) - КодСимв("A"));
   КонецЦикла;
   Возврат рез;
КонецФункции    // Из16в10

Функция Гуид32в222(Знач стр32гуид)
   ч = Из16в10(стр32гуид);
   рез = "";
   Пока 1 = 1 Цикл
       рез = Симв(33 + (ч % 222)) + рез;
       ч = Цел(ч / 222);
       Если ч = 0 Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;
   Возврат рез;
КонецФункции    // Гуид32в222

Функция Гуид222в32(Знач стр222гуид)
   ч = 0;
   Для Н = 1 По СтрДлина(стр222гуид) Цикл
       ч = ч * 222 + КодСимв(Сред(стр222гуид, Н, 1)) - 33;
   КонецЦикла;
   рез = "";
   с16 = "0123456789ABCDEF";
   Для Н = 1 По 32 Цикл
       рез = Сред(с16, 1 + (ч % 16), 1) + рез;
       ч = Цел(ч / 16);
   КонецЦикла;
   Возврат рез;
КонецФункции    // Гуид32в222
16 Suzuki
 
01.02.10
12:02
Блин, чет не получается .......
Гуид32в22("9c13000d875c639b11de451bff16e4d1") = H"-!$9>=9ZM2XE5<`R<ED1
Гуид22в32(H"-!$9>=9ZM2XE5<`R<ED1) = 9C1300D875C639B11DE451BFF16E4D1
где то потерялся "0"
17 Живой Ископаемый
 
01.02.10
12:04
Возьми не 36-ричную систему за основу, а 250-ричную...
а, Орефков предлагает 222-ричную... наверное что-то знает...
18 Bida
 
01.02.10
12:07
Модераторы, добавьте топик в базу знаний.
19 H A D G E H O G s
 
01.02.10
12:11
(17) Чтобы управляющие символы не попадались (С ASCI кодом, меньшим 32).
20 H A D G E H O G s
 
01.02.10
12:12
(17) Но вот хоть убейте, не пойму, почему нельзя представить и хранить в виде десятичного числа?
21 Suzuki
 
01.02.10
12:16
+(16) с 222 преобразование в оба конца верно
22 orefkov
 
01.02.10
12:38
(16) Точно, виноват. При преобразовании в 16ричную кадой двойки могут пропасть лидирующие нули. Если надо, могу допилить до кондиции.
23 orefkov
 
01.02.10
12:42
(20)
Длина гуида - 128 бит, те максимальный гуид = 2^128 = ~ 3,402823669209 * 10^38, те потребуется 39 знаков.
24 Suzuki
 
01.02.10
12:49
(22) Йес! Буду безмерно рад если допилите!
Зато будет чудесный набор функций и что то стоящее в БЗ
25 orefkov
 
01.02.10
13:22
(24) Вот вариант, проверенный на данных из (16)

Функция Гуид32в22(Знач стр32гуид)
   стр32гуид = Врег(стр32гуид);
   стр = "";
   Для Номер = 0 По 9 Цикл
       ч = 0;
       Для К = 1 + Номер * 3 По 3 + Номер * 3 Цикл
           с = Сред(стр32гуид, К, 1);
           ч = ч * 16 + ?(с <="9", КодСимв(с) - КодСимв("0"), 10 + КодСимв(с) - КодСимв("A"));
       КонецЦикла;
       стр = стр + Симв(33 + Цел(ч / 64)) + Симв(33 + (ч % 64));
   КонецЦикла;
   Возврат стр + Сред(стр32гуид, 31, 2);
КонецФункции    // СвернутьГуид

Функция Гуид22в32(Знач стр22гуид)
   с16 = "0123456789ABCDEF";
   стр = "";
   Для Номер = 0 По 9 Цикл
       ч = (КодСимв(Сред(стр22гуид, 1 + Номер * 2, 1)) - 33) * 64 +
           КодСимв(Сред(стр22гуид, 2 + Номер * 2, 1)) - 33;
       рез = "";
       Для К = 1 По 3 Цикл
           рез = Сред(с16, 1 + (ч % 16), 1) + рез;
           ч = Цел(ч / 16);
       КонецЦикла;
       стр = стр + рез;
   КонецЦикла;
   Возврат стр + Сред(стр22гуид, 21, 2);
КонецФункции    // Гуид22в32
26 hhhh
 
01.02.10
13:41
(24) может в вашей учетной системе сделать 2 поля: первая половина GUID, и вторая половина GUID по 18 символов и дальше не заморачиваться?
27 Suzuki
 
01.02.10
13:47
(26) проблема увеличить длину поля, новые поля вообще не обсуждаются
(25) Огромное спасибо! Все работает
ЗЫ. в Функция Гуид32в222(Знач стр32гуид)
Строку ч = Из16в10(стр32гуид); заменить на ч = Из16в10(Врег(стр32гуид));
28 orefkov
 
01.02.10
13:53
(27) Можно. Тогда и Знач в параметрах не нужно.
29 Suzuki
 
01.02.10
14:12
(28) семерки нет под рукой что бы проверить, а вот в 8.* без Врег чет не того получается
30 orefkov
 
01.02.10
14:34
(29)
А, точно. Процедура перевода 16 в 10 рассчитывает на верхнерегистровую строку, иначе перевод будет неверный.