Вход | Регистрация
    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
 
1 - 27.04.21 - 21:05
Я эту шлабуду проверил, сохранив эти ДвоичныеДанные в файл, загрузив его 16 байт в Дельфи, в TGUID и преобразуя TGUID в строку.

Именно таким образом я понял, что нужно делать:
D1=D1.Перевернуть();// hex требует bigEndian 


так как порядок байт в hex представлении не совпадал (сформированной в 1С и Дельфи).

Конечно, пофиг, у меня обратной функции не будет и она не требуется, но все же.

Вообще, нет ли каких - то вшитых ограничений на TGUID. Можно ли в него засовывать все, что хочешь.
Я прогнал 10Кзаписей и пока вроде норм.

Дальше потестю на 15 млн, но думаю, все будет ок.
   Garykom
 
2 - 27.04.21 - 21:07
(0) >ИдентификаторСтрокой=D1+"-"+D2+"-"+D3+"-"+D40+D41+"-"+D42+D43+D44+D45+D46+D47;

замени на СтрШаблон()
   vde69
 
3 - 27.04.21 - 21:08
Зачем все это?
   H A D G E H O G s
 
4 - 27.04.21 - 21:09
(3) Процитирую то, что написал на партнерке:

"В связи с активным внедрением систем маркировок и прослеживаемости товаров встает проблема адекватного хранения цифровых идентификаторов.
На данный момент, цифровые идентификаторы представлены нижней частью ASCII таблицы символов (цифры и латиница) и позволяют хранить себя в однобайтных строках.
Для цифровых идентификаторов размером 150 символов (новые алкогольные марки) это становится уже критичным.
Использование 2-хбайтных строк влечет за собой 2-х кратный рост как таблицы данных, так и таблицы индекса по этому идентификатору, а также избыточные накладные на обновление индекса и поиска по нему.
Конечно, мы можем это обойти построением хешей MD5, размером в 16 байт, которые корректно можно преобразовать в УникальныйИдентификатор и реализовать хранение средствами платформы, а значения цифровых идентификаторов хранить в хранилище значений, перегнав их в однобайтную строку, но это как то странно выглядит в целом."
   H A D G E H O G s
 
5 - 27.04.21 - 21:11
У нас таблица марок уже самая большая в системе.
Ушедшие марки я хочу архивировать, исключая из индекса строковое ее представление и помещая ее в однобайтное хранилище (скорее всего без сжатия). А в индекс засовывать 16 байтных хеш для поиска.
   Garykom
 
6 - 27.04.21 - 21:11
(0) И код оптимизируй, точнее надо будет сравнить по скорости
Может проще
ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
ХешированиеДанных.Добавить("Hello Word!");
MD5Строкой = СокрЛП(ХешированиеДанных.ХешСумма);

И далее из строки вытащить в формат для Новый УникальныйИдентификатор
   H A D G E H O G s
 
7 - 27.04.21 - 21:12
(6) "MD5Строкой = СокрЛП(ХешированиеДанных.ХешСумма);"
Это недокументированная фича.
   Garykom
 
8 - 27.04.21 - 21:12
(7) Кто сказал?
   H A D G E H O G s
 
9 - 27.04.21 - 21:13
(8) Base64Строка(), добавляющий переносы строк, сказал.
   H A D G E H O G s
 
10 - 27.04.21 - 21:14
(8) Да, это работает, но вдруг 1С скажет - ага и выключит. Лучше я документированными методами это сделаю. По быстродействию все нормально.
   Garykom
 
11 - 27.04.21 - 21:15
(9) (10) ПолучитьСтрокуИзДвоичныхДанных ?
   timurhv
 
12 - 27.04.21 - 21:16
(4) 13млн марок весит 5.5Гб с SHA256 по приходу (переделал кстать как в других темах советовали). Можно и до 3-4 Гб уменьшить, но тогда будет долгая запись.
В основном это сигареты за 10 мес. Очистку не делал, объем считаю приемлемым, когда начнут расти таблицы буду удалять проданные марки.
   H A D G E H O G s
 
13 - 27.04.21 - 21:16
(11) Нет, Егор.
   Garykom
 
14 - 27.04.21 - 21:16
(11)+ хотя это изврат
   Garykom
 
15 - 27.04.21 - 21:18
Кстати изначально хеш MD5 для поиска это изврат
   H A D G E H O G s
 
16 - 27.04.21 - 21:18
(12) Ну я пока буду архивировать, если они будут заново по возвратам заходить - разархировать.
   Garykom
 
17 - 27.04.21 - 21:19
Имхо выноси наружу из 1С и не страдай хе
   H A D G E H O G s
 
18 - 27.04.21 - 21:19
(15) Дадада, Егор. По сабжу что-то будет?
   Garykom
 
19 - 27.04.21 - 21:19
(17)+ sqlite или иная СУБД
   Garykom
 
20 - 27.04.21 - 21:20
(18) см (17)

про код ничего
   rsv
 
21 - 27.04.21 - 21:21
(0) имха зачем имитировать рабоиу субд по хранению и
поиску ?  Неужели субд загнется при поиске в табличке по полю с типом варчар150?
   H A D G E H O G s
 
22 - 27.04.21 - 21:21
(20) Ок.
   H A D G E H O G s
 
23 - 27.04.21 - 21:22
(21) А вы не в КТ-2000 работаете :-) ?
https://kt-alkogol.ru/forum/10-----/6641-khranilishche-aktsiznykh-marok.html
   Garykom
 
24 - 27.04.21 - 21:23
(21) можно SGTIN разбить на две части так то и хранить в двух табличках
   Garykom
 
25 - 27.04.21 - 21:23
(24)+ или иной идентификатор если у него определен внутренний формат по которому можно разделить
   Garykom
 
26 - 27.04.21 - 21:24
(25)+ а делать от длинного идентификатора MD5 хэш и хранить его это легкий изврат
   timurhv
 
27 - 27.04.21 - 21:25
(16) Я планирую раз в месяц\квартал окончательно удалять записи из БД после истечения срока возврата от покупателя. Удаляемые данные скидывать в текстовый файл с архивированием.
Зачем этот мусор старый? :)
   H A D G E H O G s
 
28 - 27.04.21 - 21:26
(25) (26) Это можно было бы сделать для новых марок, у которых есть значащая часть в первые 14 символов, но у нас остаются старые марки, у которых другая значащая часть. Писать 2 алгоритма это не меньший изврат.
   H A D G E H O G s
 
29 - 27.04.21 - 21:27
(25) (26) Ну и переход на эту стратегию влечет большие изменения, а тут я делаю лишь надстройку и не рушу все работающее.
   H A D G E H O G s
 
30 - 27.04.21 - 21:27
(27) Иногда может пригодиться для разбора ситуаций
 
 
   H A D G E H O G s
 
31 - 27.04.21 - 21:28
(27) Срок возврата как то регламентирован?
   Garykom
 
32 - 27.04.21 - 21:30
(31) 3 года вроде или "срок годности"
   Garykom
 
33 - 27.04.21 - 21:31
(32)+ Учти что марки будут повторяться через ХЗ лет
Это заложено
   timurhv
 
34 - 27.04.21 - 21:39
(30) Думаю файл формировать по наименованию GTIN + Год + Месяц/Квартал. Если надо будет поднять историю, то сделаю обработку по поиску марки в этих файлах.
(31) Только законом и расширенным сроком от производителя. У нас основной объем по количеству марок сигареты и молочка, не думаю что там необходимо хранить марки после продажи в течение 1-3 мес.
   BeerHelpsMeWin
 
35 - 27.04.21 - 21:53
я бы тоже все лишнее раньше какого-то периода вынес во внешний источник
   Вафель
 
36 - 27.04.21 - 22:24
А разве в алкомарке серия+номер не уникальны?
   Garykom
 
37 - 27.04.21 - 22:27
(36) "серия+номер" занимают много места в базе, ТС решил брать от них MD5 и хранить только его
   Вафель
 
38 - 27.04.21 - 22:28
Серия 3 знака и номер 8 . Итого 11
   Garykom
 
39 - 27.04.21 - 22:32
(38) хохо
   Garykom
 
40 - 27.04.21 - 22:33
   Вафель
 
41 - 27.04.21 - 22:34
(40) и что там? влом читать
   Garykom
 
42 - 27.04.21 - 22:34
(41) 150 символов что в 1С при 2 байта на символ много в базе
   Garykom
 
43 - 27.04.21 - 22:35
(42)+ 300 байт vs 16 байт УИД/Ссылка
   Вафель
 
44 - 27.04.21 - 22:36
Ну так я же предлагал оставить только серию и номер
   H A D G E H O G s
 
45 - 27.04.21 - 22:44
(44) Это на новую марку. На старую - по другому.
   Вафель
 
46 - 27.04.21 - 23:01
А эти хэши хранить где?
В новом справочнике?
   mistеr
 
47 - 27.04.21 - 23:03
А каков размер самих этих марок? Я просто не в теме.

Причины заморачиваться с хешами должны быть очень весомые. Место на дисках сейчас не дорогое.
   aka MIK
 
48 - 27.04.21 - 23:04
(15) почему? долго md5 рассчитывается? есть метрики?
   Garykom
 
49 - 27.04.21 - 23:09
(48) та не просто сама идея хеша для ускорения поиска теряется тут
от дублей защита слабая что один хэш будет на разные марки
короче изврат
   aka MIK
 
50 - 27.04.21 - 23:14
(49) хеш не будет один на разные марки, это же его суть
   Garykom
 
51 - 27.04.21 - 23:22
(50) опс
   Garykom
 
52 - 27.04.21 - 23:23
   H A D G E H O G s
 
53 - 28.04.21 - 01:05
(46) Отдельный РС.

Значения ШК я сначалл хотел вынести в отдельный справочник и хранить их по 10000 значений в элементе, чтобы было эффективное сжатие, а в РС - указатель на место ШК (аналог хранения в файлах), но обнаружилось, что коэффициент сжатия 1 Мб шк всего 50% (1 Мб сжимается в 500 Кб), так как криптохвосты слишком уникальны.
Лучше всего срабатывал bzip2 (скорее всего из-за преобразования Барроуза — Уилера), но на столь малый выигрыш я решил забить и хранить ШК в элементе справочника.
   Конструктор1С
 
54 - 28.04.21 - 06:07
Эм... А стоит ли овчинка выделки? Расчет делал, сколько твои 15 млн занимают и втом и в том виде?
   Йохохо
 
55 - 28.04.21 - 06:25
(52) мд5 не надежен из-за существования алгоритма поиска коллизии, а не из-за алгоритма формирования. по мощности вроде 10е-8 данные/мд5, на реальных будет типа 10е-30 и все норм если в егаис хацкеров не завезут
   Йохохо
 
56 - 28.04.21 - 06:29
+ афаир там атака подменой блока, т.е. она алгоритмически не реализуема на 200 байтах
   Почему 1С
 
57 - 28.04.21 - 07:43
(54) 166 против 300 байт
(0) Каким методом получаешь однобайтовую строку?
   victuan1
 
58 - 28.04.21 - 08:09
(28) А чем плохо написать разные алгоритмы для разных видов марок?
1) для ЧЗ: ГТИН+СерНУМ
2) для новой алкомарки: первые 14 символов
3) для старой алкомарки: 23 символа, начиная с 9-го.

Чем не ХЭШ-функция? И никаких вероятностных коллизий. И заодно готовый КИ (CIS) без траты времени его вычисления доп. функцией
   sitex
 
59 - 28.04.21 - 08:11
(0) Спрашивается, для чего хранить это в 1С, может все таких вынести.?
   sitex
 
60 - 28.04.21 - 08:12
(58) Не меньше времени уйдет вычислять какой вид у тебя марки .
 
 
   Кирпич
 
61 - 28.04.21 - 08:21
Нахер чота выдумывать. Хранить как есть во внешней базе. Дешево, удобно и практично. Пока Китайцы не перестали делать нам новые террабайтные диски, проблем нету.
   Почему 1С
 
62 - 28.04.21 - 08:24
(61) Как будто хранение во внешней базе сделано из коробки и не надо для этого тоже код писать выдумывать. А потом при надобности обратно все забирать из внешней базы.
   Кирпич
 
63 - 28.04.21 - 08:25
(62) Программисты напишут. Один хрен сидят на мисте. Пускай работают.
   sitex
 
64 - 28.04.21 - 08:31
(0) Во одной конторе, видел вынос базы по маркам в MongoDB. Подробностей не знаю реализации . Просто видел что в базе этих марок нет.
   timurhv
 
65 - 28.04.21 - 08:55
(58) Разные регистры букв для запроса СУБД одно и тоже:
00000000000001aaaaaaa
00000000000001AAAAAAA

Соответственно в регистр сведений 1С эти марки не запишутся и вывалится ошибка: "Запись с такими ключевыми полями существует!".
   Kongo2019
 
66 - 28.04.21 - 08:56
(0)Круто подошел, а тупо запихал во отдельную базу, на Firberd, сделал свою оболочку для обмена.
   Garykom
 
67 - 28.04.21 - 09:02
(55) Причем тут поиск коллизии когда даже без специального поиска вероятность наткнуться слишком высока
И то что ТС "проверил на 15 млн. записей, коллизий не нашел" нихрена не значит
   Garykom
 
68 - 28.04.21 - 09:03
(61) +1 за внешнее хранение
   Кирпич
 
69 - 28.04.21 - 09:13
(68) Да тупо базу 1с с одним справочником и http сервисом. Это если не обучен всяким эскулайтам, фаирбёрдам и прочим питонам с сишарпами
   Кирпич
 
70 - 28.04.21 - 09:13
миллион ключей это 150 мегабайт
   Почему 1С
 
71 - 28.04.21 - 09:19
(70) 300 же, но все равно фигня согласен.
   Кирпич
 
72 - 28.04.21 - 09:20
(71) почему 300? вроде 150 байт одна марка
   Garykom
 
73 - 28.04.21 - 09:24
(72) марка да а хранение символов в строках в 1С 2 в 1
   Кирпич
 
74 - 28.04.21 - 09:28
(72) А. Ну тогда если мало, то на 1с, а если много, то на любую другую субд
   H A D G E H O G s
 
75 - 28.04.21 - 10:56
Вы такие интересные.
А что даст вынос во внешнюю базу?
   Кирпич
 
76 - 28.04.21 - 10:59
(75) Так вроде бы место в базе хотели съэкономить
   Kongo2019
 
77 - 28.04.21 - 11:00
(75) Так это с ней можно работать напрямую, не средствами 1С.
причем FireBerd делает MSSQL в легкую.
да железо у меня слабое, и готовит я не умею. Ну как-то так. вот.
   H A D G E H O G s
 
78 - 28.04.21 - 11:05
(76) Ну базу то нужно разместить на том же сервере. По сети мы потеряем в производительности.
   Кирпич
 
79 - 28.04.21 - 11:14
(78) А у вас конвейер чтоли с бутылками?
   Кирпич
 
80 - 28.04.21 - 11:14
Или алкогольный гипермаркет
   Garykom
 
81 - 28.04.21 - 11:15
(78) Какой именно производительности вы потеряете?
Думаешь запрос внутри 1С быстрее чем запрос наружу?
   H A D G E H O G s
 
82 - 28.04.21 - 11:16
(79) Ну типа подождут?
   Garykom
 
83 - 28.04.21 - 11:16
(82) Типа ты протести, причем смотря как делать запросы
   Кирпич
 
84 - 28.04.21 - 11:16
(82) Ту долю миллисекунды подождут
   mistеr
 
86 - 28.04.21 - 11:17
(75) Например, возможность использовать все возможности СУБД для компактного хранения.

И для эффективного поиска, вроде блум фильтров.
   Garykom
 
87 - 28.04.21 - 11:17
(85) У тебя сервер 1С один хер сервер sql вызывает
И точно такое же если прямые запросы можешь делать на тот же сервер sql
Только не через запросы 1С а напрямую
   H A D G E H O G s
 
88 - 28.04.21 - 11:18
Хотя нет, немного не так я общение построил.
Егора я просто игнорить буду.
   Конструктор1С
 
89 - 28.04.21 - 11:18
(57) получается вся затея ради экономии пары гигабайт места на диске? Ну я прям не знаю...
   Garykom
 
90 - 28.04.21 - 11:18
(89) Хохо. Бэкап базы 1С
   Garykom
 
91 - 28.04.21 - 11:20
(90)+ Мы как доки из документооборота вынесли так бэкап (который по сложным графикам и много хранится долго) стал вместо 20 гигов всего 200мб
   H A D G E H O G s
 
92 - 28.04.21 - 11:20
(89) 15 млн марок занимает 14 Гб места. Это я замерял на одном из клиентов, который набрал такой объем за 10 месяцев.
Сейчас есть клиент, который заявляет 10 млн марок за месяц. Давайте посчитаем, сколько Гб места потребуется клиенту в год на хранение всего одной таблицы в базе?
   Конструктор1С
 
93 - 28.04.21 - 11:20
(87) ком-соединения будут долго подниматься
   Garykom
 
94 - 28.04.21 - 11:21
(93) в жопу ком
   Garykom
 
95 - 28.04.21 - 11:21
(94)+ имхо ВК или http даже если списком марки а не по одной
   Кирпич
 
96 - 28.04.21 - 11:24
(92) А не анализировали как часто им эти марки нужно потом из базы доставать?
   sitex
 
97 - 28.04.21 - 11:25
(93) COM вообще надо забыть как страшный сон и не произносить в слух. )))
   H A D G E H O G s
 
98 - 28.04.21 - 11:25
(96) Нет, не анализировали.
Но иногда нужно понимать, какие марки продавали клиенту, когда он заявляет пересорт, к примеру.
   sitex
 
99 - 28.04.21 - 11:26
(98) А какие сложности итого по выносу ? .Если  у других уже есть практика выноса за пределы 1С
   Кирпич
 
100 - 28.04.21 - 11:27
В 1с их точно пихать не надо. Хоть заужимайся, один хрен база распухать будет. Да и вычисление MD5 это нихрена не быстрый процесс. Не намного быстрее обращения через сеть.
  1  2  3  4  5   

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