Вход | Регистрация
    1  2  3  4  5   

Прошу проверить код

Прошу проверить код
Я
   H A D G E H O G s
 
27.04.21 - 21:00
Дня доброго.
Есть задача собрать хеш с данных, записать его в 1С и выполнять поиск по нему.
Хеш я решил собрать MD5, проверил на 15 млн. записей, коллизий не нашел.
MD5 - это 16 байт и я их отлично засуну в УникальныйИдентификатор 1С и проиндексирую.
В виде строки это будет 32 символа, 64 байта в данных и такое хранение хеша и его индекса нам и вообще не нужно.

Новый ХешированиеДанных(MD5) возвращает хеш в виде ДвоичныхДанных, которые мне надо преобразовать в UUID.
Делаю я это так:

Функция ПреобразоватьДвоичныеДанныеВУникальныйИдентификатор(Данные) Экспорт
    Если Данные.Размер()<>16 Тогда //В уникальном идентификаторе должно быть 16 байт
        Возврат Неопределено;
    КонецЕсли;
    БуферДвоичныхДанныхХеша=ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные); // 16 байт
    
    D1=БуферДвоичныхДанныхХеша.ПолучитьСрез(0,4); // 4 первых байта
    D1=D1.Перевернуть(); // hex требует bigEndian
    D2=БуферДвоичныхДанныхХеша.ПолучитьСрез(4,2); // 2 вторых байта
    D2=D2.Перевернуть();
    D3=БуферДвоичныхДанныхХеша.ПолучитьСрез(6,2); // 2 третьих байта
    D3=D3.Перевернуть();
    D4=БуферДвоичныхДанныхХеша.ПолучитьСрез(8);   // 8 байт остатка
    D40=D4.ПолучитьСрез(0,1);
    D41=D4.ПолучитьСрез(1,1);
    D42=D4.ПолучитьСрез(2,1);
    D43=D4.ПолучитьСрез(3,1);
    D44=D4.ПолучитьСрез(4,1);
    D45=D4.ПолучитьСрез(5,1);
    D46=D4.ПолучитьСрез(6,1);
    D47=D4.ПолучитьСрез(7,1);
    
    D1=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D1);
    D2=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D2);
    D3=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D3);
    D40=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D40);
    D41=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D41);
    D42=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D42);
    D43=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D43);
    D44=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D44);
    D45=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D45);
    D46=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D46);
    D47=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(D47);
    ИдентификаторСтрокой=D1+"-"+D2+"-"+D3+"-"+D40+D41+"-"+D42+D43+D44+D45+D46+D47;
    Возврат Новый УникальныйИдентификатор(ИдентификаторСтрокой);    
КонецФункции
   H A D G E H O G s
 
101 - 28.04.21 - 11:27
(99) У всех есть какая-то практика и они ее придерживаются.
   Конструктор1С
 
102 - 28.04.21 - 11:27
(92) так и в чём проблема? Клиенту лишь надо подкупить ХДД, которые обойдутся в разы дешевле работ по оптимизации
   Kongo2019
 
103 - 28.04.21 - 11:28
(92) Ну пусть диски купит. У месяц, линия розлива до 100 гигов в пике. И ниче. Купили PCI-E SSD на терабайту нормально тянет.
   H A D G E H O G s
 
104 - 28.04.21 - 11:28
(102) Я это делаю в свое свободное личное время.
   Конструктор1С
 
105 - 28.04.21 - 11:30
(104) ну тады ладн
   mistеr
 
106 - 28.04.21 - 11:31
(98) Для "иногда" как раз лучше внешняя БД. А если это единичные случаи, то можно и текстовый фай разархивировать и погрепать.

Жаль, что не анализировали. От тебя я наоборот ожидал системного подхода.
   H A D G E H O G s
 
107 - 28.04.21 - 11:33
(106) Звиняйте, ананасав нема.
   Вафель
 
108 - 28.04.21 - 11:35
(98) какие марки продавали ты не узнаешь, только можно будет определить продавали ли эти конкретно марки или нет
   Garykom
 
109 - 28.04.21 - 11:36
(107) Дима, вот ты иногда упираешься как животное на букву б
   Вафель
 
110 - 28.04.21 - 11:36
(106) +1 за внешнюю БД
   H A D G E H O G s
 
111 - 28.04.21 - 11:37
(108) А?
   H A D G E H O G s
 
112 - 28.04.21 - 11:37
(110) Вопрос даже не стоит
   Вафель
 
113 - 28.04.21 - 11:37
(111) у тебя же кода не будет, только хэш.
А это односторонняя функция
   sitex
 
114 - 28.04.21 - 11:37
(110) Голосовалки жаль нет.
   Вафель
 
115 - 28.04.21 - 11:38
(112) ну вот уже и твоя система начинает обрастать костылями вместо нормальных решений
   ILM
 
116 - 28.04.21 - 11:39
Если на блокчейн перевести алкомарки, то может пить перестанут. Пока новый блок найдется, пока на его основе создадут набор акцизов и т.д.
   Кирпич
 
117 - 28.04.21 - 11:39
   H A D G E H O G s
 
118 - 28.04.21 - 11:40
(100) 71К преобразований за 6 секунд. Ну в принципе, долговато, но я попробую вынести в ВК, может даст эффект.
https://prnt.sc/126uedx
   H A D G E H O G s
 
119 - 28.04.21 - 11:40
(113) Будет, Анатолий.
   Вафель
 
120 - 28.04.21 - 11:41
(119) если код остается, то в чем вообще смысл тогда
   Кирпич
 
121 - 28.04.21 - 11:42
(118) А если процессор начнет дымить, то можно форточку открыть
   H A D G E H O G s
 
122 - 28.04.21 - 11:42
(113) Ты немного не понял.
Проблема то в том, что
Алкомарка храниться в избыточных 300 байтах с избыточным индексом по этим 300 байтам.

Я эти 300 байт заменяю на 16 байт хеша.

А этот 150 символьный код храню в отдельном реквизите как 150 байт в ДвоичныхДанных, так как у 1С нет однобайтных строк.
И при необходимости, могу сделать обратную операцию.
   H A D G E H O G s
 
123 - 28.04.21 - 11:43
(121) Ахахаха.
   Вафель
 
124 - 28.04.21 - 11:44
(122) и какой выигрыш на 1 млн марок?
   sitex
 
125 - 28.04.21 - 11:45
(122) Получается еще и * 2 данные в базе.
   H A D G E H O G s
 
126 - 28.04.21 - 11:46
(124)
300 Мб данных превращаются в 16 Мб данных.
300*1.2 Мб индекса превращаются в 16*1.2 Мб индекса

Добавляется 150 Мб данных.
   sitex
 
127 - 28.04.21 - 11:50
(126) Время на обработку всех этих манипуляций и время выноса в стороннюю БД - очень интересно где профит будет выше.
   H A D G E H O G s
 
128 - 28.04.21 - 11:51
(127) Время на обработку будет ночью регламентным заданием
   Garykom
 
129 - 28.04.21 - 11:51
(117) Подразумевал те которые Муфлоны и Уриалы
   Ёпрст
 
130 - 28.04.21 - 11:52
(122) ты в наименование свой хеш закинуть хочешь ?
А саму марку хранить еще где, с ссылкой на этот хеш ?
ЗЫ: всё не читал
 
 
   sitex
 
131 - 28.04.21 - 11:53
(128) А если потребуется здесь и сейчас ? нужны данные по поиску по конкретной марки Отчет движения ?
   Кирпич
 
132 - 28.04.21 - 11:53
А можно копнуть в сторону переделать строку чтобы она занимала 150 байт. Выглядеть будет типа как абракадабра, но зато 150, а не 300
   H A D G E H O G s
 
133 - 28.04.21 - 11:54
(131) Марка в архиве будет восстанавливаться обратной функцией.
   H A D G E H O G s
 
134 - 28.04.21 - 11:55
(132) nvarchar в SQL-е занимает 2 байта на символ.
   sitex
 
135 - 28.04.21 - 11:55
(133) Это понятно. Интересно что будет быстрее.
   Кирпич
 
136 - 28.04.21 - 11:57
(134) ну и пускай. пихать в нее строку 75 символов. В базе будет 150
   Кирпич
 
137 - 28.04.21 - 11:57
Нолики поудалять
   H A D G E H O G s
 
138 - 28.04.21 - 11:57
(130) Сейчас у меня есть справочник Марки, код храниться в Наименовании.
Я планирую сделать отдельный РС, в котором буду хранить хеш и ссылку на справочник, в справочнике Наименование будет пусто, а в отдельном реквизите "АрхивДанныхМарки" торчать код марки.
   H A D G E H O G s
 
139 - 28.04.21 - 11:58
(136) Я это сделаю через ХранилищеЗначений.
   Кирпич
 
140 - 28.04.21 - 11:59
(139) Так надо же индекс делать
   H A D G E H O G s
 
141 - 28.04.21 - 11:59
(140) см (138). Индекс будет в регистре на Хеш
   Вафель
 
142 - 28.04.21 - 12:02
а зачем дополнительный регистр?
   Кирпич
 
143 - 28.04.21 - 12:02
(141) Да нафиг хеш. Просто строковое поле в регистре. Только ужатое до 150 байт и всё. Чтобы хеши не считать
   Garykom
 
144 - 28.04.21 - 12:03
   H A D G E H O G s
 
145 - 28.04.21 - 12:05
(142) Если мы добавим UID в справочник - мы сразу увеличим его на 16+16*1.2 байт на элемент для всех элементов, даже не подлежащих архивации. Это же не строковый реквизит, который 0 байт, когда он пуст.
   Кирпич
 
146 - 28.04.21 - 12:05
Типа было
$0070 0071 0072 0065
стало $7071 7265
КодСимвола($7071) + КодСимвола($7275)
   H A D G E H O G s
 
147 - 28.04.21 - 12:06
(146) А давай ты это сделаешь и продемонстрируешь, а я посмотрю на это?
   Вафель
 
148 - 28.04.21 - 12:07
(145) те хэш ты на для всех вычисляешь? а как поиск марки будет выполняться для незахэшированных?
   mistеr
 
149 - 28.04.21 - 12:08
(144) Колеса не каноничной формы.
   sitex
 
150 - 28.04.21 - 12:10
(146) И что ? Будет $0070 7001 0072 0065 или $0070 0701 0702 0605 Дубль ?
   Garykom
 
151 - 28.04.21 - 12:10
(149) По канону я тоже умею

Например тупо марку перевожу в несколько УИДов и храню в РС в измерениях
   Garykom
 
152 - 28.04.21 - 12:10
(151)+ Перевожу без хеширования
   Кирпич
 
153 - 28.04.21 - 12:10
(147) А мне это зачем? Ты же научные изыскания проводишь. Я тебе предлагаю вариант. Может оно быстрее работать будет, а места занимать меньше.
   Garykom
 
154 - 28.04.21 - 12:11
150 символов = УИД1+УИД2+УИД3+...
Это измерения будут
А Ресурс что хошь
   H A D G E H O G s
 
156 - 28.04.21 - 12:12
(148) (148) По коду, по 150 символам. Поиск нужен при загрузке входящей ТТН и при сканировании на ТСД.
При загрузке входящей ТТН с признаком Возврат буду еще искать и по хешу, при сканировании на ТСД - искать по коду, если не нашел - тогда по хешу.
   Кирпич
 
157 - 28.04.21 - 12:13
(150) Ты ничо не понял
   sitex
 
158 - 28.04.21 - 12:14
(157) понял как (137) написал
   H A D G E H O G s
 
159 - 28.04.21 - 12:16
(153) Мне нет резона рассматривать этот вариант. Я просто переведу строку в однобайтную и сохраню ее через Поток в ХранилищеЗначений.
   Garykom
 
160 - 28.04.21 - 12:17
(159) что думаешь на (154)? идею понял?
 
 
   Почему 1С
 
161 - 28.04.21 - 12:19
Интересно почему MS SQL server не поддерживает UTF-8 вместо юникода, это же самая оптимальная кодировка для строк.
   Ёпрст
 
162 - 28.04.21 - 12:23
(138) АрхивДанныхМарки..это строка 150 пожатая в хранилище ?
   Ёпрст
 
163 - 28.04.21 - 12:24
Так то идея понятна..ищем в наименовании, если дырка, преобразуем в хешь ищем в РС.. так ?
   H A D G E H O G s
 
164 - 28.04.21 - 12:27
(163) Воистену!
   H A D G E H O G s
 
165 - 28.04.21 - 12:27
(162) Да. Но не пожатая. Просто 150 символов в 150 байт.
Жать коды марок - неэффективно.
   Вафель
 
166 - 28.04.21 - 12:30
можно же еще съэкономить 1 байт больше 1 символа из кода
   Ёпрст
 
167 - 28.04.21 - 12:30
Посмотрел у себя.. 55млн, ~22гига (данные+индекс)
   H A D G E H O G s
 
168 - 28.04.21 - 12:33
(167) хранится в 1С? У меня еще в коде справочника лежит 19 символов алкокода (38 байт данных+38*1.2 байт на индекс). Его тоже под нож.
   Ёпрст
 
169 - 28.04.21 - 12:41
(168) да, в 1с .. база на скуле..

А так, не проще пожать, чем в уид преобразовывать ?

    ХЗ = Новый ХранилищеЗначения(НашеЗначениеКотороеНадоСжать,Новый СжатиеДанных(9));
    СтрокаBase64 = СериализаторXDTO.XMLСтрока(ХЗ);
    СжатыеДвоичныеДанные = Base64Значение(СтрокаBase64);


    СтрокаBase64 = Base64Строка(СжатыеДвоичныеДанные);
    ХЗ = СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64);
    НашеЗначение = ХЗ.Получить();


©Спиз@но с нимфостарта
   Вафель
 
170 - 28.04.21 - 12:43
а зачем хранилище в строку преобразовывать?
   H A D G E H O G s
 
171 - 28.04.21 - 12:45
(169) Не жмется код марки.

Даже если их собрать единный блок из 10000 марок - тогда коэффициент сжатия будет 50% и то с bzip2, который умеет предварительно сортировать данные. Мне лениво таким заморачиваться.
   Ёпрст
 
172 - 28.04.21 - 12:52
(171) ясна, надо потестить..
Пока не критично. У меня РС с марками пока больше весит, чем сам справочник марок, ибо индекс покрывающий много весит.
Думаю, от чего бы избавиться. Тоскливо планы опять мониторить и собирать статистику использования индексов.
   H A D G E H O G s
 
173 - 28.04.21 - 12:55
(172) Да, у меня на 2 ом месте РС. Но там уже не от чего не избавиться.
Сколько времени убито на вылизывания взаимоблокировок и попадания в индексы - я его ни за что уже не трону.
   H A D G E H O G s
 
174 - 28.04.21 - 12:56
(172) Ну и все списанное через несколько дней сбрасывается во 2 РС, там с индексами попроще.
   sitex
 
175 - 28.04.21 - 12:56
(171) Для одной марки применить Арифметическое кодирование. :)
   H A D G E H O G s
 
176 - 28.04.21 - 12:57
(175) Свой алфавит, вы об этом?
   H A D G E H O G s
 
177 - 28.04.21 - 13:06
Мдацкое ХранилищеЗначений сериализует мои 150 байт в 233 байта при сохранении без сжатия и в 216 байт при сжатии.
Наверное надо будет делать блоки марок.
   sitex
 
178 - 28.04.21 - 13:06
(176) я в смысле применить эту методику кодирования к 1 марке. Возможно будет эффект
   Garykom
 
179 - 28.04.21 - 13:11
(177) Нахер?
Ты можешь просто взять свои 150 символов и поделить их на нужное число УИД каждый по 36
Тупо превратить их в УникальныйИдентификатор и заюзать как измерения в РС, в ресурс пиши 1
   sitex
 
180 - 28.04.21 - 13:12
(178) + из 50 символов ,все равно будут повторения последовательностей  символов, по этому можно их посчитать.
   sitex
 
181 - 28.04.21 - 13:12
+(180) *150 символов
   H A D G E H O G s
 
182 - 28.04.21 - 13:13
(181) Нет там повторений, иначе их сжатие по словарю нормально бы сжимали.
   Dzenn
 
183 - 28.04.21 - 13:14
Могу предложить радикальное решение твоей проблемы с хэшами, MD5 и UUID — не работай на "алкоголиков", "табачников" и прочих распространителей наркоты.
   sitex
 
184 - 28.04.21 - 13:15
(182) Давай пример 150 символов
   H A D G E H O G s
 
185 - 28.04.21 - 13:17
(183) Это интересно.
   H A D G E H O G s
 
186 - 28.04.21 - 13:17
(184)
233300070266990119001TKU362V3E6AH5VNFAUTTF4X7IUTSAACSQG4MRFW4UYWIWQITOCBXZWG63SPFTFPUFDTJS6QKSRYQ4I4MRKIBH34F6FQHDCOJASAGVHP3LGMUDD3TG3K62BFAQZ5QKR5OQ
   Kongo2019
 
187 - 28.04.21 - 13:18
(186) Криптохвост он в поиске как бы не сильно нужен. Может отбросит?
   sitex
 
188 - 28.04.21 - 13:20
(186) Ну и как нет, есть. Видать вы не поняли выше коммент о чем я имею ввиду.
   H A D G E H O G s
 
189 - 28.04.21 - 13:21
(187) Я думал об этом, но мне стало лениво морочаться со старой и новой маркой.
   H A D G E H O G s
 
190 - 28.04.21 - 13:21
(188) Приведите конкретнее пример.
   Kongo2019
 
191 - 28.04.21 - 13:23
(189) Мне проще, я производство, у меня только новая.
   sitex
 
192 - 28.04.21 - 13:25
(186) Уникальных - 35 , Текст  = 2307691TKUVEAH5NF4XISCQGMRWYOBZPDJLG ,
Сим    Кол
3    10
f    9
6    8
t    8
q    8
0    7
   sitex
 
193 - 28.04.21 - 13:26
(192) + потому сюда частотные интервалы, и т.д.
   sitex
 
194 - 28.04.21 - 13:26
+ (192) Сим, и кол. не все в сообщение вошли
   sitex
 
195 - 28.04.21 - 13:28
(194) + это очень в сильно кратко, много чего упущено
   ptiz
 
196 - 28.04.21 - 13:32
Раз начали меряться:
у меня уже 120 млн. кодов упаковок лекарств в системе в виде справочника - это 100Гб.
Столкнувшись с кодами, отличающимися только регистром символов (руки оторвать бы архитектору в ЦРПТ, который придумал такую возможность), влепил строку 50 символов под Base64Строка(КодУпаковки). Но у меня в справочник и без того 15 реквизитов.
К концу года ожидаю 400Гб только таблицу упаковок.
   H A D G E H O G s
 
197 - 28.04.21 - 13:33
(196)
"Столкнувшись с кодами, отличающимися только регистром символов (руки оторвать бы архитектору в ЦРПТ, который придумал такую возможность),"

Люто плюсую.
   sitex
 
198 - 28.04.21 - 13:35
(196) Не хило вас прет)
   H A D G E H O G s
 
199 - 28.04.21 - 13:36
Архитектору ЦРПТ, мы, конечно, поставим отдельную песню:
https://youtu.be/7GPmw7LhE3M
   H A D G E H O G s
 
200 - 28.04.21 - 13:37
(196) Типовой "ШтрихкодыУпаковокТоваров"?
Мои соболезнования.
  1  2  3  4  5   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.