Эффективные способы узнать, изменилась ли строка / файл - crc32? md5? что-то другое? - PullRequest
1 голос
/ 02 октября 2009

Я ищу эффективный способ узнать, изменилась ли строка (или файл) со времени нашего последнего просмотра.

Итак, мы запускаем эту функцию для 1 000 000 файлов / строк (каждый файл / строка меньше 1000 байт) и сохраняем выходные данные для каждого файла / строки.

Я подожду несколько дней и снова запустю. Мне нужно выяснить, изменился ли каждый файл или нет ...

Должен ли я рассчитывать CRC32 для каждого файла? MD5? Что-то еще более эффективное?

Достаточно ли CRC32, чтобы сообщить мне, изменился ли файл / строка?

РЕДАКТИРОВАТЬ Он должен работать как со строками обоих файлов , так и , поэтому временные метки для файлов исключены.

Ответы [ 7 ]

1 голос
/ 02 октября 2009

Для файлов вы можете использовать отметку времени.

Для строк вы можете сохранить резервную копию.

Простое сравнение и перезапись резервной копии может быть так же быстро, как CRC или MD5.

1 голос
/ 02 октября 2009

CRC32 или CRC64 отлично справятся с этой задачей.

Возможно, вы даже сможете использовать его в качестве основы для поиска хешей.

1 голос
/ 02 октября 2009

Для файлов, вы должны смотреть на содержимое? Файловая система будет отслеживать измененную временную метку.

0 голосов
/ 02 октября 2009

Сравнение строк будет более эффективным, чем crc32 или md5, или любой другой предложенный алгоритм хеширования.

Для начала вы можете выйти из сравнения строк, как только две строки различаются, тогда как при использовании алгоритма хеширования вы должны хешировать все содержимое файла, прежде чем вы сможете сделать сравнение.

Более того, алгоритмы хеширования имеют операции, которые они должны выполнять для генерации хеша, тогда как сравнение строк проверяет равенство между двумя значениями.

Я полагаю, что сравнение файлов / строк на основе строк, которые при коротком замыкании при первом сбое (на файл / строку) обеспечат вам хорошую производительность.

0 голосов
/ 02 октября 2009

Вы сказали, что данные будут содержать около миллиона строк / файлов по 1 КБ, и вы хотите проверять их каждые несколько дней. Если это так, вам действительно не нужно беспокоиться о производительности, поскольку обработка 1 ГБ данных не займет много времени, не имеет значения, используете ли вы crc32 или md5.

Я предлагаю использовать md5, потому что он менее вероятен, чем crc32. Crc32 справится с этой задачей, но вы можете получить лучший результат, не вкладывая гораздо больше средств.

Edit: Как сказал кто-то другой, сравнение строк с резервной копией происходит быстрее. (Потому что вы можете прервать работу, как только два символа будут различаться). Это не на 100% верно, если вам нужно прочитать строку из файла. Если мы предположим, что строки получены из файлов, и вы используете md5, вам придется прочитать 32 байта плюс среднее значение длины строки для каждой строки, которую вы хотите сравнить. Когда вы сравниваете байт за байтом, вам нужно прочитать как минимум 2 байта, а за максимальное время буксировки длину строки. Поэтому, если у многих ваших строк одинаковое начало (больше символов, чем 32 + среднее значение длины строк равно), вы будете быстрее с хэшем. (Поправьте меня, если я ошибаюсь). Так как это теоретический случай, вам будет хорошо придерживаться сравнения по типу. Если среднее значение длины строки превышает 32 байта, при использовании хеша вы сэкономите место на диске; -).

Но, как я уже говорил выше; производительность не будет вашей проблемой при работе с этим количеством данных.

0 голосов
/ 02 октября 2009

Я использую MD5 для такого типа вещей, кажется, работает достаточно хорошо. Если вы используете .NET, см. System.Security.Cryptography.MD5CryptoServiceProvider.

0 голосов
/ 02 октября 2009

В Java вы можете сделать:

File file = new File(filePath);

file.lastModified();
...