Вход | Регистрация
    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;
    Возврат Новый УникальныйИдентификатор(ИдентификаторСтрокой);    
КонецФункции
   ptiz
 
201 - 28.04.21 - 13:44
(200) Нет, у нас ничего типового нет. Своё, но всё надо.
   Kongo2019
 
202 - 28.04.21 - 13:58
В типовых там вообще реализацию на тестировали на скорость, десять записей на тесте они что-ли гоняют.
   Кирпич
 
203 - 28.04.21 - 13:58
(147) //А давай ты это сделаешь и продемонстрируешь, а я посмотрю на это?
&НаКлиенте
Функция ВУжатую(Стр)
    Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(Стр, "windows-1251");
    Возврат ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер, "UTF-16LE");
КонецФункции

Функция ИзУжатой(Стр)
    Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(Стр, "UTF-16LE");
    Возврат ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер, "windows-1251");
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)
    Ужатая = ВУжатую("0123456789");
    НеУжатая = ИзУжатой(Ужатая);
    Сообщить(НеУжатая);
    Сообщить(СтрДлина(Ужатая));
    Сообщить(СтрДлина(НеУжатая));
КонецПроцедуры


   ptiz
 
204 - 28.04.21 - 14:02
(5) "Ушедшие марки я хочу архивировать" - а ссылки на них в виде чего остаются?
Что такое "марка" сейчас? Строка? Ссылка на справочник?

У меня тоже будет задача удалять старые упаковки, но задача упирается в логическую модель:
- будут битые ссылки в документах, а чтобы удалить документ - придется делать свертку с "вводом остатков" (документ двигает регистр сведений - историю движений упаковки). А ввод остатков по сотням миллионов упаковок .... но куда деваться.

Архивировать старые упаковки смысла не вижу - всё равно они проданы. Правда, у меня есть вторая база - промежуточная между основной и ЦРПТ, там можно будет старую историю найти.
   Кирпич
 
205 - 28.04.21 - 14:03
+(203)Теперь можно тупо в регистр сведений. 150 байт съэкономили. Индекс есть. Хеши вычислять не надо.
   H A D G E H O G s
 
206 - 28.04.21 - 14:03
(203) Епстественно я это попробовал.
Когда сохранишь строку в БД она станет размером в 300 байт
   Кирпич
 
207 - 28.04.21 - 14:04
(206) поставь размер поля 75. задолбал
   Кирпич
 
208 - 28.04.21 - 14:05
и будет 150
   H A D G E H O G s
 
209 - 28.04.21 - 14:11
(207) Я с вами вежливо общаюсь, но похоже, абсолютно зря. Идите ка вы лесом.
   Кирпич
 
210 - 28.04.21 - 14:12
(209) Ладно не обижайся. Я ж любя.
   H A D G E H O G s
 
211 - 28.04.21 - 14:14
(210) Давай ты сохранишь в примитивнейший справочник строку в 1 байт через 1С.
   Кирпич
 
212 - 28.04.21 - 14:15
(211) И нахрена?
   Почему 1С
 
213 - 28.04.21 - 14:17
(203) Исходная строка "0123456789" - 10 байт, сжимаем - "㄰㌲㔴㜶㤸" - 10 байт, 
отличное сжатие я считаю
   Вафель
 
214 - 28.04.21 - 14:19
(213) исходная строка 20 байт
   H A D G E H O G s
 
215 - 28.04.21 - 14:19
(212) Чтобы понять, что решение нерабочее.
   Вафель
 
216 - 28.04.21 - 14:20
(215)  почему нерабочее то?
   Почему 1С
 
217 - 28.04.21 - 14:20
(214) В 1С 10 байт, а в SQL да 20, понял фишку приема.
   Вафель
 
218 - 28.04.21 - 14:21
(217) в 1с 10 - СИМВОЛОВ
   Кирпич
 
219 - 28.04.21 - 14:22
(215) а (217) уже понял
   Кирпич
 
220 - 28.04.21 - 14:22
почти :)
   Кирпич
 
221 - 28.04.21 - 14:22
(215) так почему не работает?
   Почему 1С
 
222 - 28.04.21 - 14:23
(218) 10 символов из пределов ASCII =  10байт в UTF-8, в SQl согласен 10 символов = 20 байт, а закодированных 5 символов = 10 байт, смысл есть
   Garykom
 
223 - 28.04.21 - 14:24
Марки имеют ограниченный набор символов же!
Можно сжимать использую кириллицу
   Garykom
 
224 - 28.04.21 - 14:24
(221) Ты про это (223) ранее писал?
   mistеr
 
225 - 28.04.21 - 14:28
(196) >руки оторвать бы архитектору в ЦРПТ

Может, лучше архитектору платформы?
   Garykom
 
226 - 28.04.21 - 14:29
(225) На ЦРПТ зря бочку катят там вполне продумано и хорошо по сравнению с ЕГАИС
   Garykom
 
227 - 28.04.21 - 14:30
(226)+ А реализация в конфах 1С это к ЦРПТ никак не относится
   Ёпрст
 
228 - 28.04.21 - 14:30
(226) Да-да..завести кучку левого и продать, очень хорошо в цтрп придумали.
   Ёпрст
 
229 - 28.04.21 - 14:31
И пока эти дыры не прикрыты, никак
   Ёпрст
 
230 - 28.04.21 - 14:31
А ждать ответа годами..
 
 
   Ёпрст
 
231 - 28.04.21 - 14:31
не, нам такого счастья не нать
   Вафель
 
232 - 28.04.21 - 14:34
(222) можно и сильнее сжать ибо там всего 36 символов
   Garykom
 
233 - 28.04.21 - 14:34
(228) Т.е. ты жалуешься что еще не все дыры прикрыты?
Не волнуйся постепенно дойдет что воровать станет дороже чем не воровать
   Кирпич
 
234 - 28.04.21 - 14:55
Продолжаем изыскания. Забил в гугл переводчик урезаную марку. Вот результат:

㌵㌳〰 㜰 ㈰ 㘶 㤹 ㄰ 啋 насмешка 唳 䄶 㕈 兆 рвота 噔 夷 рвота 㜰 ㈰ 㘶 㤹 ㄰ писк 啋 㘳 перед уходом
   Кирпич
 
235 - 28.04.21 - 14:56
что то алкогольное в этом есть
   Кирпич
 
236 - 28.04.21 - 14:58
И "перед уходом" тоже в тему. Ухожу с 1 мая на cdj,jlyjt бомжевание в связи с увольнением :))
   Garykom
 
237 - 28.04.21 - 15:03
(236) Меня в отпуск даже не пускают...
   Кирпич
 
238 - 28.04.21 - 15:05
Китайский регистр сведений. всё работает, HADGEHOGs. Одно измерение в 75 символов

https://ibb.co/hZKmPS1
   H A D G E H O G s
 
239 - 28.04.21 - 15:06
(238) Все, я вкурил.
Да, это работает.
   H A D G E H O G s
 
240 - 28.04.21 - 15:06
Признаю свою ошибку перед Кирпич. Его метод позволяет сохранить строку так, как мне надо.
   Кирпич
 
241 - 28.04.21 - 15:07
(237) Да нафиг щас отпуск. Ковид. Копим деньги, сидим дома
   H A D G E H O G s
 
242 - 28.04.21 - 15:08
Теперь получается все достаточно легко сделать без своих blob структур
   Кирпич
 
243 - 28.04.21 - 15:09
(240) Нифига ты правильный какой :) (239) вполне достаточно
   H A D G E H O G s
 
244 - 28.04.21 - 15:14
Блин, хоть бери и преобразовывай все марки
   Garykom
 
245 - 28.04.21 - 15:31
Извращенцы зачем вам китайский когда можно просто строку из 150 символов разбить на уиды по 36?
последний дополнить 0
   Почему 1С
 
246 - 28.04.21 - 15:33
(244) Я только не понял, почему в Хранилище значений  из 150 байт получилось вдруг 230. Откуда столько лишних байтов.
   H A D G E H O G s
 
247 - 28.04.21 - 15:35
(246) Сериализация.
   Garykom
 
248 - 28.04.21 - 15:37
(246) Там как строка по сути хранится в base64 вроде бы
   Garykom
 
249 - 28.04.21 - 15:40
(0) В конечном итоге один хрен придется на внешнее (относительно 1С) хранение перейти!
   ptiz
 
250 - 28.04.21 - 15:42
Вот что бы мы все делали без маркировки? А тут работы привалило! :)
   Kongo2019
 
251 - 28.04.21 - 15:42
(250) Нам и без маркировки есть чем заняться.
   Ёпрст
 
252 - 28.04.21 - 16:36
(244) Но... наименование удалять всё равно будешь и РС новый лепить ?...
Или просто наименование  на китайщину поменяешь ? :)
   Ёпрст
 
253 - 28.04.21 - 16:36
В принципе, замена на китайщину уже в 2 раза меньше размер.
   H A D G E H O G s
 
254 - 28.04.21 - 16:36
(252) Наименования чистить. Индекс же.
   Ёпрст
 
255 - 28.04.21 - 16:42
(254) да, но если не чистить, а тупо китайщиной заменить, то в 2 раза пожмётся и так.
А в менеджере справочника в представлении уже подменять китайщину на нужное.. и всё красиво - на экране норм шк, в базе китайщина, и без РС
   H A D G E H O G s
 
256 - 28.04.21 - 16:42
(255) Ну да, но это полумеры.
   aka MIK
 
257 - 28.04.21 - 17:12
(245) а 1С даст запихнуть в УИД любую неформатную хрень?
   H A D G E H O G s
 
258 - 28.04.21 - 17:16
(257) Вроде дает.
   aka MIK
 
259 - 28.04.21 - 17:20
(206) поставь фиксированную длину строки - будет nchar(150), а это 150 байт
   aka MIK
 
260 - 28.04.21 - 17:22
А нет, обманули )
 
 
   aka MIK
 
261 - 28.04.21 - 17:29
Но 2 байта можно сэкономить )
   victuan1
 
262 - 29.04.21 - 06:57
(239) А если усовершенствовать "метод Кирпича", то можно строку сократить не до 75 символов, а до 38! ;)
   victuan1
 
263 - 29.04.21 - 07:01
(192) "Уникальных - 35 , Текст  = 2307691TKUVEAH5NF4XISCQGMRWYOBZPDJLG"
Нет, всего 23 символа, начиная с 9-го, писал об этом в (58).
   Kongo2019
 
264 - 29.04.21 - 08:17
(262)И как?
   victuan1
 
265 - 29.04.21 - 08:31
(264) Емкость алфавита алкомарки 36 символов (10 цифр + 26 лат. букв).
Емкость 1 байта = 255.
256 / 36 = 7,1111.
Следовательно в одном байте (символе) можно хранить 7 символов алкомарки.
Длина алкомарки = 150 символов.
Следовательно, для хранения одной марки требуется 150 / 7 = 22 байта.
в 1с8 можно хранить в виде "китайского" алфавита по "методу Кирпича" в строке длиной 2*22 символа (выше я немного ошибся, написал 38).
   Вафель
 
266 - 29.04.21 - 08:46
(265) получается что делаем хэш на 16 байт от данных на 22 байта
   timurhv
 
267 - 29.04.21 - 09:14
(196) "Столкнувшись с кодами, отличающимися только регистром символов (руки оторвать бы архитектору в ЦРПТ, который придумал такую возможность),"
А что делать, если у молочки только 5 символов в серийном? Это только 656млн марок на одну продукцию без верхнего регистра, а с ним почти 4млн.
   timurhv
 
268 - 29.04.21 - 09:14
(267) *4млрд
   Garykom
 
269 - 29.04.21 - 09:18
(266) дык написать свой https://ru.wikipedia.org/wiki/Base64
на основе символов в марках
   victuan1
 
270 - 29.04.21 - 09:19
(265) Ой, я лажу написал. Надо же не делить, а вычислять логарифм по основанию 2.
Получается для 36 символьного алфавита нужно 6 бит с избытком, значит строку в 150 символов можно хранить в 114 байтах.
   Garykom
 
271 - 29.04.21 - 09:20
(269) к (265)
   Garykom
 
272 - 29.04.21 - 09:21
(270) Не так считаешь, там просто не в байтах хранение а в битах
   victuan1
 
273 - 29.04.21 - 09:22
(267) ну да в битах: 150 симв. * 6 бит = 900 бит
Что примерно равно = 113 байтов (900 / 8)
   Garykom
 
274 - 29.04.21 - 09:22
(272)+ в смысле 36 это не 6 бит ровно а дробное и можно это дробное для следующего символа алфавита использовать
   victuan1
 
275 - 29.04.21 - 09:23
(274) Об этом тоже думал, но экономия будет не соизмерима со сложностью алгоритма.
   victuan1
 
276 - 29.04.21 - 09:24
(274) Если так рассуждать, то и до алгоритмов сжатия дойдем))
   ptiz
 
277 - 29.04.21 - 09:25
(267) В лекарствах - 13. Вопрос к тем, кто такое придумал. Зато у вас криптохвоста нет. Как жить без него будете - не представляю :)
   Garykom
 
278 - 29.04.21 - 09:25
(276) угу по Шеннону
   Garykom
 
279 - 29.04.21 - 09:25
(277) в МДЛП криптохвост есть но он только в печатном виде в обменах не участвует
   Garykom
 
280 - 29.04.21 - 09:28
(278)+ ли все же Хаффману?
   Garykom
 
281 - 29.04.21 - 09:30
   fisher
 
282 - 29.04.21 - 09:40
Действительно. Если паковать в 22 байта, то хешировать смысла нет. И можно будет это засунуть в 11-символьную китайскую строку :)
   fisher
 
283 - 29.04.21 - 09:43
Хотя стоп. Не. В 11-символьную не засунешь.
   fisher
 
284 - 29.04.21 - 09:49
Что-то вы намутили с китайскими UTF. Там же еще номер страницы сидит плюс китайские символы до 4 байтов могут занимать.
Напрашивается в два уида кодировать. И хрен с ним с хвостиком.
   fisher
 
285 - 29.04.21 - 09:54
Стоп. Зачем уид? А сколько в базе займет тупо 4 разрядное целое?
   fisher
 
286 - 29.04.21 - 09:58
Не, это я гоню.
   Garykom
 
287 - 29.04.21 - 10:13
(284) разбивать на уиды я предложил еще хз когда
   fisher
 
288 - 29.04.21 - 10:19
(287) Просто практичнее всего таки использовать байт на символ, а это дохрена уидов получается. Идея в (203) очень привлекательная, но у меня есть подозрения, что не взлетит. То есть преобразования в 75 строку туда и обратно могут происходить с потерей данных.
   H A D G E H O G s
 
289 - 29.04.21 - 10:21
(263) Очень  странно судить по алфавиту марки, опираясь на один пример.
   fisher
 
290 - 29.04.21 - 10:25
В принципе, еще достаточно практично получится пихать 3 символа в два байта. То есть упаковать в 100 байт.
Если уидами без хеширования, то это 7 уидов. Тоже как-то несподручно.
   victuan1
 
291 - 29.04.21 - 10:45
(289) То есть? Я опираюсь не на один пример, а на знания того как устроена алкомарка.
   H A D G E H O G s
 
292 - 29.04.21 - 11:02
(291) Ок. Я просто подумал, что вы написали, исходя из сообщений выше.
   victuan1
 
293 - 29.04.21 - 11:07
(292) Вот регулярное выражение для проверки алкомарок всех типов (150, 68 и 40 (очень древних) символьных):
([1-9]\d{2}|\d([1-9]\d|\d[1-9])){2}([1-9]\d{7}|\d([1-9]\d{6}|\d([1-9]\d{5}|\d([1-9]\d{4}|\d([1-9]\d{3}|\d([1-9]\d{2}|\d([1-9]\d|\d[1-9])))))))(0[1-9]|1[0-2])(1[8-9]|[2-9][0-9])([1-9]\d{2}|\d([1-9]\d|\d[1-9]))[0-9A-Z]{129}|\d\d[a-zA-Z0-9]{21}\d[0-1]\d[0-3]\d{10}[a-zA-Z0-9]{31}|[0-9]{40}

Как видим разрешены только A-Z0-9 - т.е. алфавит 36 симв.
   Вафель
 
294 - 29.04.21 - 11:25
(284) могут и занимать по 4, но мы же берем только те что по 2 байта.
мы же не переводим человеческий язык
   Вафель
 
295 - 29.04.21 - 11:29
несколько гуидов - это не очень хорошо, ибо нужно рс городить для поиска
   Garykom
 
296 - 29.04.21 - 11:39
(295) РС быстрее чем справочник и очень удобно
   Garykom
 
297 - 29.04.21 - 11:40
(296)+ Точнее неудобно что идентификатора нет и в другие объекты в реквизит ссылку не засунешь
Но в задаче это не особо надо
   Вафель
 
298 - 29.04.21 - 11:42
(297) а где хранить марки привязанные к документам?
там же эти составные уиды и хранить?
   Garykom
 
299 - 29.04.21 - 11:44
(298) Дополнительное измерение ведущее в РС, там уид, этот уид в документах
   Garykom
 
300 - 29.04.21 - 11:44
300
  1  2  3  4  5   

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