powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Подскажите алгоритм сжатия строки текста
32 сообщений из 32, показаны все 2 страниц
Подскажите алгоритм сжатия строки текста
    #34052350
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется поле, куда можно записать строку не длиннее 20 символов, а сама строка имеет длину 36 символов (это GUID). Может, существует алгоритм сжатия этого GUID хотя бы до 20 символов с последующим восстановлением к первоначальному виду?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052358
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КеусИмеется поле, куда можно записать строку не длиннее 20 символов, а сама строка имеет длину 36 символов (это GUID). Может, существует алгоритм сжатия этого GUID хотя бы до 20 символов с последующим восстановлением к первоначальному виду?

Если GUID типа
910023AC-56DC-48B5-BB86-55C1C9A21AC1
то его можно хранить в 16 байтах.

1) убираем "-"
2) преобразуем пару шестнадцетиричных символов "91" в байт;
3) преобразуем следующую пару
...
--------------------------
вообще-то GUID так и хранится в нормальных системах, а к 36-символьному виду приводится только для показа человеку.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052363
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще-то GUID так и хранится в нормальных системах, а к 36-символьному виду приводится только для показа человеку.

К сожилению приходится использовать 1С, а в ней типы могут быть только "число", "строка", "Дата". Поэтому GUID может быть только строкой.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052372
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поэтому GUID может быть только строкой.

Потому и задумался, как строку сжать и разжать без потерь.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052439
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеус
вообще-то GUID так и хранится в нормальных системах, а к 36-символьному виду приводится только для показа человеку.

К сожилению приходится использовать 1С, а в ней типы могут быть только "число", "строка", "Дата". Поэтому GUID может быть только строкой.

Ну и что?
а) 1С вполне справляется со строками длиннее 20 символов...
б) Строка может содержать ЛЮБЫЕ значения байта как символ строки - выглядит канешна страшновато, но тебе ж на нее не любоваться? См. алгоритм выше.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052524
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 Кеус: вы таким образом место на диске пытаетесь сэкономить?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052536
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При большом желании можно получить и 20 печатных символов (из диапазона кодов 33-126).
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052649
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkiades1 Кеус: вы таким образом место на диске пытаетесь сэкономить?

Нет. Просто в 1С по номеру документа самый быстрый способ поиска. А номер документа не может превышать 20 символов. За месяц в базе создается и передается в другие организации около 200 000 документов. Раньше идентификатор конкретного документа состоял из 10 символов, теперь вот из 36.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052658
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а) 1С вполне справляется со строками длиннее 20 символов...

Номер документа не может.


б) Строка может содержать ЛЮБЫЕ значения байта как символ строки - выглядит канешна страшновато, но тебе ж на нее не любоваться? См. алгоритм выше.

А влезут ли они в 20 символов?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34052685
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarloneПри большом желании можно получить и 20 печатных символов (из диапазона кодов 33-126).

Можно поподробнее?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34053933
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеус
а) 1С вполне справляется со строками длиннее 20 символов...

Номер документа не может.


б) Строка может содержать ЛЮБЫЕ значения байта как символ строки - выглядит канешна страшновато, но тебе ж на нее не любоваться? См. алгоритм выше.

А влезут ли они в 20 символов?

1символ=1байту. Учи матчасть.
-------------------------
исключение unicode-символы, дык в один unicode-символ можно аж два байта забабахать...
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34053986
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Элементарнейшая экономия, это компоновка бит. Если диапозон используемых симоволов 0-9, т.е. 10 симовлов, то для их сохранения достаточно 4 бита (имеет 16 значений). Таким образом в байт можно положить 2 символа. Если диапозон симовлов больше 16-ти, то количество бит прийдется увеличить.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34053997
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеус BarloneПри большом желании можно получить и 20 печатных символов (из диапазона кодов 33-126).

Можно поподробнее?

Ну изучай принцЫпы MIME-encoding... разные там методы есть.

Всего надо закодировать 16*8=128 бит

126-33+1=94 различных символов

Кодируем 128 битное число по основанию 94, используя символы как цифры разрядов.

log2(94)= 6.555 бит/символ

[128/6.(5)]=19.528 символа.
=================
=> можно.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34054416
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КеусНет. Просто в 1С по номеру документа самый быстрый способ поиска. А номер документа не может превышать 20 символов. За месяц в базе создается и передается в другие организации около 200 000 документов. Раньше идентификатор конкретного документа состоял из 10 символов, теперь вот из 36.

1)строкой длиной в 20 символов из больших букв латинского алфавита можно занумеровать ~20^20 документов , чего хватит на 20^20 / 20000 месяцев работы проги что много больше времени предпологаемого существования солнечной системы.

Нужен ли тут именно GUID???
а может просто номер числовой??

зы. бедные юзери ищущие документ по гуид
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055015
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks2

Спасибо за разъяснение. Хранить символы в байтах и битах это конечно хорошо, но платформа 1С этого не позволяет. Я могу использовать только "Строка" или "Число". Т.е. мне надо строку из 36 символов превратить в строку (число) максимум в 20 символов, а потом без потерь восстановить в первоначальный вид.
Я просто не представляю, как записать байты в строковое или числовое поле. Если не трудно покажите, пожалуйста, как будут выглядеть в виде байтов несколько первых символов этой строки (910023AC-56DC-48B5-BB86-55C1C9A21AC1), а то без конкретного примера я не соображу, как это будет.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055026
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Палестинец
1)строкой длиной в 20 символов из больших букв латинского алфавита можно занумеровать ~20^20 документов , чего хватит на 20^20 / 20000 месяцев работы проги что много больше времени предпологаемого существования солнечной системы.

Нужен ли тут именно GUID???
а может просто номер числовой??

Да нам и 10 символов хватало, но решили перейти на GUID в качестве идентификатора не мы, а Москва, при том по всей стране.



Палестинецзы. бедные юзери ищущие документ по гуид

У каждого документа есть серия и номер, который видят пользователи, но он может быть не уникальный. Идентификатор используется только для электронного обмена. Да и на уровне нашей организации ни кто не работает конкретно с каждым документом в ручную. Используют только общие данные, типа суммы выплаты вознаграждения по всем документам конкретного учреждения.


У нас в области есть около 70 учреждений, где создаются каждый день куча документов, затем эти документы в электронном формате передаются нашей организации. Мы их заносим в базу и раз в месяц все эти документы выгружаем в один файл и отдаем в следующую организацию, а та в свою очередь еще в одну. Затем всё это возвращается назад по той же цепочке. При том один и тот же документ может месяцами ходить по этой цепочке. Каждый такой документ должен уникально идентифицироваться, раньше в качестве уникального номера использовался «код учреждения»+»порядковый номер документа» в этом учреждении. Затем в Москве решили перейти на единый формат обмена файлами и в качестве уникального идентификатора документа предписали использовать GUID (формат обмена действует для всей страны в рамках этого направления). От GUID отказаться нельзя, создать дополнительный реквизит для хранения GUID можно, но поиск по нему будет очень медленный и загрузка \ выгрузка данных затянется на сутки.

Хранение символов в байтах я понимаю, но как записать их в 1С не представляю.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055077
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеус
вообще-то GUID так и хранится в нормальных системах, а к 36-символьному виду приводится только для показа человеку.

К сожилению приходится использовать 1С, а в ней типы могут быть только "число", "строка", "Дата". Поэтому GUID может быть только строкой.А разрядность "числа" у этой чудо-системы какая?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055219
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlА разрядность "числа" у этой чудо-системы какая?

Длина числа может быть 20 знаков с точностью в 9.
Можно записать число Пи: 3.141592653
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055293
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеус От GUID отказаться нельзя, создать дополнительный реквизит для хранения GUID можно, но поиск по нему будет очень медленный и загрузка \ выгрузка данных затянется на сутки.

Может, возможно нужный индекс в базе создать просто?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055307
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеус aleks2

Спасибо за разъяснение. Хранить символы в байтах и битах это конечно хорошо, но платформа 1С этого не позволяет. Я могу использовать только "Строка" или "Число". Т.е. мне надо строку из 36 символов превратить в строку (число) максимум в 20 символов, а потом без потерь восстановить в первоначальный вид.
Я просто не представляю, как записать байты в строковое или числовое поле. Если не трудно покажите, пожалуйста, как будут выглядеть в виде байтов несколько первых символов этой строки (910023AC-56DC-48B5-BB86-55C1C9A21AC1), а то без конкретного примера я не соображу, как это будет.

Я без Help-а програмиировать в 1C не могу - не помню имен функций наизусть... на VBA - пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Compare Database
Option Explicit

Private Const HEX As String = "0123456789ABCDEF"

Sub GuidToStr16(ByVal aGUID As String, ByRef aStr16 As String)
Dim i As Long
   aGUID = Mid(aGUID,  2 , Len(aGUID) -  2 )
   aGUID = Replace(aGUID, "-", "")
   aStr16 = ""
   For i =  1  To  32  Step  2 
     aStr16 = aStr16 + Chr(InStr(HEX, Mid(aGUID, i,  1 )) +  16  * InStr(HEX, Mid(aGUID, i +  1 ,  1 )))
   Next
End Sub

Sub tst()
  Dim g As String, s16 As String
  g = "(910023AC-56DC-48B5-BB86-55C1C9A21AC1)"
  GuidToStr16 g, s16
  MsgBox s16
End Sub
----------------------------------------------
Извиняй, но кодировать число по основанию 94 - учись сам.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055542
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks2 на VBA - пожалуйста

Спасибо за пример. Понял Вашу мысль, вроде то, что мне может подойти.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055550
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlМожет, возможно нужный индекс в базе создать просто?

1С не позволяет самому создавать индексы. Точнее, там есть несколько намертво записанных полей, по которым оптимизирован поиск и они присутствуют во всех документах. Можно создать свои поля (реквизиты) для поиска, но по ним поиск значительно медленней, чем по предопределенным в системе.
1С не удовлетворительно работает с задачей, для которой мы её используем. Как оказалось с большим объемом данных она не справляется. Если использовать дополнительные реквизиты для поиска, то мы не сможем уложиться в отведенные нам временные рамки. Вот и приходится через математику решать возникающие проблемы.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34055787
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зато MS SQL вполне может позволить создать-таки нужный индекс. Хотя у вас, возможно, файл-серверная версия..
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34058696
RasimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кеус
вообще-то GUID так и хранится в нормальных системах, а к 36-символьному виду приводится только для показа человеку.

К сожилению приходится использовать 1С, а в ней типы могут быть только "число", "строка", "Дата". Поэтому GUID может быть только строкой.
Разбей на две части и храни в двух строках
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34060314
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAlХотя у вас, возможно, файл-серверная версия..
И документов 200000/мес?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34062182
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич DocAlХотя у вас, возможно, файл-серверная версия..
И документов 200000/мес?

1C у нас SQL версии. Сомневаюсь, что без вреда для самой 1С не из конфигуратора можно создавать индексы. Документов создается 200 000 в месяц, и от раза к разу их всё больше.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34064875
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было б интересно узнать, о каком вреде идёт речь... Если, конечно, не о копеечном замедлении занесения данных в базу.)
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34065350
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlБыло б интересно узнать, о каком вреде идёт речь... Если, конечно, не о копеечном замедлении занесения данных в базу.)

Имеется в виду, что разработчики 1С не рекомендуют что-то менять не посредственно в SQL базе. Конечно это не факт, что возникнут проблемы, но не хочется повредить такую большую базу. Можно делать прямые запросы в SQL базу и даже добавлять новые данные, но создавать индексы... 1С вроде сама создает и удаляет нужные индексы. Проблема не в SQL базе, а в среде 1С. Она сама по себе замедляет работу, прямой запрос к SQL базе выдает результат в 60 раз быстрее, чем тот же запрос в 1С, но это не наш вариант. Исключительно по административным причинам.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34070038
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создай в Документы->ОбщиеРеквизиты реквизит GUID. поставь галочку отбор.
И в экспорт импорт вместо номера подставляй этот реквизит. и всё.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34072940
Кеус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПалестинецСоздай в Документы->ОбщиеРеквизиты реквизит GUID. поставь галочку отбор.
И в экспорт импорт вместо номера подставляй этот реквизит. и всё.


В общем случае это хороший вариант. Такую возможность я знаю, мы её рассматривали, но поиск по общему реквизиту всё равно медленней, чем поиск по номеру документа. При небольшом объеме данных это не так заметно, а при нашем имеет значение каждый процент производительности.
Период поиска документа у нас год. Потому что дата документа может, изменится, с даты допустим текущего месяца, после исправления в учреждении стать датой прошлого или даже позапрошлого месяца. Такая возможность вероятна. Если бы период был месяц, то поиск по общему реквизиту нас бы устроил, но к сожалению это не так.
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34092969
ффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks2

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Compare Database
Option Explicit

Private Const HEX As String = "0123456789ABCDEF"

Sub GuidToStr16(ByVal aGUID As String, ByRef aStr16 As String)
Dim i As Long
   aGUID = Mid(aGUID,  2 , Len(aGUID) -  2 )
   aGUID = Replace(aGUID, "-", "")
   aStr16 = ""
   For i =  1  To  32  Step  2 
     aStr16 = aStr16 + Chr(InStr(HEX, Mid(aGUID, i,  1 )) +  16  * InStr(HEX, Mid(aGUID, i +  1 ,  1 )))
   Next
End Sub

Sub tst()
  Dim g As String, s16 As String
  g = "(910023AC-56DC-48B5-BB86-55C1C9A21AC1)"
  GuidToStr16 g, s16
  MsgBox s16
End Sub



А как востановить тот ГУИД номер?
...
Рейтинг: 0 / 0
Подскажите алгоритм сжатия строки текста
    #34121465
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ффф aleks2

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Compare Database
Option Explicit

Private Const HEX As String = "0123456789ABCDEF"

Sub GuidToStr16(ByVal aGUID As String, ByRef aStr16 As String)
Dim i As Long
   aGUID = Mid(aGUID,  2 , Len(aGUID) -  2 )
   aGUID = Replace(aGUID, "-", "")
   aStr16 = ""
   For i =  1  To  32  Step  2 
     aStr16 = aStr16 + Chr(InStr(HEX, Mid(aGUID, i,  1 )) +  16  * InStr(HEX, Mid(aGUID, i +  1 ,  1 )))
   Next
End Sub

Sub tst()
  Dim g As String, s16 As String
  g = "(910023AC-56DC-48B5-BB86-55C1C9A21AC1)"
  GuidToStr16 g, s16
  MsgBox s16
End Sub



А как востановить тот ГУИД номер?

А подумать? Нет прЫвычки?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Option Compare Database
Option Explicit

Private Const HEX As String = "0123456789ABCDEF"

Sub GuidToStr16(ByVal aGUID As String, ByRef aStr16 As String)
Dim i As Long
   aGUID = Mid(aGUID,  2 , Len(aGUID) -  2 )
   aGUID = Replace(aGUID, "-", "")
   aStr16 = ""
   For i =  1  To  32  Step  2 
     aStr16 = aStr16 + Chr(InStr(HEX, Mid(aGUID, i,  1 )) -  1  +  16  * (InStr(HEX, Mid(aGUID, i +  1 ,  1 )) -  1 ))
   Next
End Sub

Function Str16ToGuid(ByVal aStr16 As String) As String
Dim i As Long, s As String, b As Byte
   s = ""
   For i =  1  To  16 
     b = Asc(Mid(aStr16, i,  1 ))
     s = s + Mid(HEX, (b And &HF) +  1 ,  1 )
     s = s + Mid(HEX, Int(b /  16 ) +  1 ,  1 )
   Next
   
   Str16ToGuid = "(" + Left(s,  8 ) + "-" + Mid(s,  9 ,  4 ) + "-" + Mid(s,  13 ,  4 ) _
                + "-" + Mid(s,  17 ,  4 ) + "-" + Right(s,  12 ) + ")"
End Function

Sub tst()
  Dim g As String, s16 As String
  g = "(910023AC-56DC-48B5-BB86-55C1C9A21AC1)"
  GuidToStr16 g, s16

  MsgBox Str16ToGuid(s16)
End Sub
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Подскажите алгоритм сжатия строки текста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]