0. hakerxp 2169 01.08.16 10:41 Сейчас в теме

Оптимальный способ расчета контрольной суммы объекта/записи регистра (CRC32, MD5, SHA1, SHA256)

Была задача сравнить документы в распределенных базах и пометить на выгрузку измененные. Но сравнение изменений документов методом перебора реквизитов - долгоиграющий процесс, особенно если общее количество сравниваемых данных переваливает за миллион. Был найден выход, который ускоряет процесс сравнения - расчет контрольной суммы объекта и сравнение ее с другой контрольной суммой. Скорость сравнения увеличивается во много раз.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. klinval 286 01.08.16 11:50 Сейчас в теме
Не понял в чём суть алгоритма вычисления контрольной суммы?
Или в этом и фишка: скачай обработку, посмотри код и увидишь алгоритм?
2. hakerxp 2169 01.08.16 12:02 Сейчас в теме
(1), в обработке пример расчета контрольной суммы.
3. gubanoff 46 01.08.16 13:08 Сейчас в теме
Неплохо бы в статье рассказать, как и что.
5. ditp 50 01.08.16 13:49 Сейчас в теме
(3) gubanoff,
Ой та шо там рассказывать... получаем некое описание объекта и считаем от него хеш.
Например так:

Функция ХэшДокумента(СсылкаНаДокум)
	Докум	= СсылкаНаДокум.ПолучитьОбъект();
	мтДок	= Докум.Метаданные();
	зап		= Новый ЗаписьXML;
	зап.УстановитьСтроку();
	зап.ЗаписатьНачалоЭлемента("obj");
	зап.ЗаписатьАтрибут("Дата"	, XMLСтрока(Докум.Дата));
	зап.ЗаписатьАтрибут("Номер"	, XMLСтрока(Докум.Номер));
	зап.ЗаписатьАтрибут("Пров"	, XMLСтрока(Докум.Проведен));
	зап.ЗаписатьАтрибут("Удал"	, XMLСтрока(Докум.ПометкаУдаления));
	Для Каждого рекв Из мтДок.Реквизиты Цикл
		зап.ЗаписатьАтрибут(рекв.Имя, XMLСтрока(Докум[рекв.Имя]));
	КонецЦикла;
	Для Каждого тч Из мтДок.ТабличныеЧасти Цикл
		зап.ЗаписатьНачалоЭлемента(тч.Имя);
		Для Каждого стр Из Докум[тч.Имя] Цикл
			зап.ЗаписатьНачалоЭлемента("line");
			Для Каждого рекв из тч.Реквизиты Цикл
				зап.ЗаписатьАтрибут(рекв.Имя, XMLСтрока(стр[рекв.Имя]));
			КонецЦикла;
			зап.ЗаписатьКонецЭлемента();
		КонецЦикла;
		зап.ЗаписатьКонецЭлемента();
	КонецЦикла;
	зап.ЗаписатьКонецЭлемента();

	хеш	= Новый ХешированиеДанных(ХешФункция.SHA1);
	хеш.Добавить(зап.Закрыть());
	
	Возврат хеш.ХешСумма;
КонецФункции
Показать


В примере -- документ, но для всего остального аналогично.
Вместо SHA1 можно использовать CRC, MD5 или SHA256.
6. hakerxp 2169 01.08.16 14:42 Сейчас в теме
(5), сложно у вас написано. Все намного проще. По просьбе трудящихся выкладываю текст.
7. gubanoff 46 01.08.16 16:01 Сейчас в теме
(6) ну вот, все стало понятно. Как и предполагалось, выгрузка в ХМЛ и получение хеша от файла. Эталонный подход :)
8. cleaner_it 239 03.08.16 11:45 Сейчас в теме
(6) (7) gubanoff, тогда непонятно, откуда взялся выигрыш по скорости. Для начала нужно рассчитать хеш для миллионов записей, а это тоже время.
9. hakerxp 2169 03.08.16 12:21 Сейчас в теме
(8), получение объекта или создание структуры данных записи, намного быстрее, чем перебирать реквизиты, измерения, ресурсы и искать отличия. Ну и проще. Приведу пример. У меня система сравнивает данные независимых регистров сведений в различных базах РИБ. Таблица общая получается более 1 млн. записей. Так вот - затраты на создание данной таблица по времени - около 10 мин. в одной базе и столько же в другой. Время сравнения по моему алгоритму - так же 10-15 мин. (больше времени тратится на регистрацию данных для обмена, чем на сравнение). Железо не серверное. База и СУБД пашут на простом жестком, не SSD.
4. davdykin 20 01.08.16 13:48 Сейчас в теме
Действительно, вы бы хоть принцип рассказали, я так понимаю эти алгоритмы считают хэш строк, как вы получаете эту строку
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 110 000 руб. до 150 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата до 200 000 руб.
Полный день

Программист 1С
Тольятти
зарплата от 70 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Программист 1С
Воронеж
зарплата от 70 000 руб.
Полный день