Страницы: 1
RSS
Расчет хэша для совокупности данных в книге, посоветуйте реализацию функции
 
Стоит задача расчета уникального идентификатора для совокупности данных в книге (20 листов, текст, даты и действительные числа), чтобы имелась возможность сравнивать разные версии книг между собой на совпадение. На каждом листе может быть до 1000 строк данных, от 4 до 15 колонок. Полагаю, что простой склейкой всех значений с произведением на номер строки и номер графы и последующим использованием хэш-функции задачу не решить по технологическим причинам (слишком большая вычислительная сложность, да и в одну строковую переменную столько текста не влезет).

Каким образом можно реализовать искомое?
 
Доброе время суток
Цитата
Hugger написал:
(слишком большая вычислительная сложность, да и в одну строковую переменную столько текста не влезет
Почему не влезет? Пусть на одну ячейку приходится текст в среднем длинной 100 символов, тогда всего 30 000 000 символов. Согласно справке допустимое число символов в строке can contain up to approximately 2 billion (2^31) characters. Так что всё влезет, даже если по 1000 символов на ячейку. Для указанного выше числа символов в C#
Код
System.Security.Cryptography.SHA256.ComputeHash(Encoding.Unicode.GetBytes(new string('C', 30000000))

Посчитал за 2 секунды. VBA раз в 10 медленнее, ну, и на сбор строки тоже время  - думаю в минуту на файл вложитесь ;)
Успехов.
 
А как посоветуете учитывать расположение значений на листе? Копировать лист в массив для ускорения и потом приклеивать к значению каждой ячейки при соединении в строку индекс графы, строки и номер листа и затем считать хэш?
Изменено: Hugger - 05.01.2017 22:54:25
 
Склеивание значений больших массивов может занять много времени (соединение строк в VBA медленное)

номера строк / столбцов можно не запоминать
для преобразования содержимого листа в текстовую строку возьмите эту функцию
http://excelvba.ru/code/Range2CSV
пример её использования для активного листа:
Код
текст = Range2CSV(ActiveSheet.usedrange)
а если надо учитывать также изменения форматирования / примечаний / прочего НЕконтента, — то я использовал бы хеш файла Excel
(создаете копию файла методом ActiveWorkbook.SaveCopyAs, читаете текст файла, вычисляете хеш)

пример кода для вычисления хеша
http://excelvba.ru/code/MD5
 
Большое спасибо! Хотя особых проблем со скоростью при тестировании расчета хэша склеиванием строк из массива я не заметил, но функция вычисления md5-хэша файла будет тоже мне очень полезной.
Страницы: 1
Читают тему
Наверх