Существует ли алгоритм хеширования, который терпим к незначительным различиям?

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

Существуют ли какие-либо алгоритмы хеширования, которые работают для чего-то вроде этого?

Ответ 1

Общим способом подобия документа является shingling, что несколько более активно, чем хеширование. Также рассмотрите содержимое, определенное фрагментацией, чтобы разделить документ.

Несколько лет назад я прочитал статью об использовании Bloom filters для обнаружения сходства. Использование Bloom Filters для уточнения результатов веб-поиска. Это интересная идея, но мне никогда не приходилось экспериментировать с ней.

Ответ 2

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

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

Вы также можете попробовать какой-то гибридный подход - пусть алгоритм хэширования сообщает вам, что все изменения были сделаны, и использовать его в качестве триггера для получения архивной копии документа для более строгого сравнения (Levenshtein).

Ответ 3

http://www.phash.org/ сделал что-то подобное для изображений. Суть: взять изображение, размыть его, преобразовать в оттенки серого, сделать дискретное косинус-преобразование и посмотреть только на верхний левый квадрант результата (где важная информация). Затем записывайте 0 для каждого значения меньше среднего и 1 для каждого значения больше, чем среднее. Результат довольно хорош для небольших изменений.

Min-Hashing - еще одна возможность. Найдите функции в тексте и запишите их как значение. Объедините все эти значения, чтобы создать хэш-строку.

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

Ответ 4

Прошу прощения, но хеш-алгоритмы точно. Они не способны терпимо относиться к незначительным различиям. Вы должны принять другой подход.