![]() |
![]() |
![]() |
|
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 рассчитывает на верхнерегистровую строку, иначе перевод будет неверный. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |