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

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

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

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

Комментарии
Избранное Подписка Сортировка: Древо
1. klinval 286 01.08.16 11:50 Сейчас в теме
Не понял в чём суть алгоритма вычисления контрольной суммы?
Или в этом и фишка: скачай обработку, посмотри код и увидишь алгоритм?
2. hakerxp 2172 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 2172 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 2172 03.08.16 12:21 Сейчас в теме
(8), получение объекта или создание структуры данных записи, намного быстрее, чем перебирать реквизиты, измерения, ресурсы и искать отличия. Ну и проще. Приведу пример. У меня система сравнивает данные независимых регистров сведений в различных базах РИБ. Таблица общая получается более 1 млн. записей. Так вот - затраты на создание данной таблица по времени - около 10 мин. в одной базе и столько же в другой. Время сравнения по моему алгоритму - так же 10-15 мин. (больше времени тратится на регистрацию данных для обмена, чем на сравнение). Железо не серверное. База и СУБД пашут на простом жестком, не SSD.
4. davdykin 20 01.08.16 13:48 Сейчас в теме
Действительно, вы бы хоть принцип рассказали, я так понимаю эти алгоритмы считают хэш строк, как вы получаете эту строку
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

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

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

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

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