Здравствуй,
Поддерживает ли xxhash хеширование на основе скользящего окна? Например, предположим, что мы используем скользящее окно фиксированного размера из 48 байтов. Сначала мы вычисляем xxhash для первых 48 байтов (0-47 байтов). Затем, возможно ли вычислить следующее скользящее окно со смещением 1-48, вычтя воздействие из 0-го байта и добавив 48-й байт, без вычисления xxhash с нуля?
Нет, xxhash - это не скользящий хеш.
Это потребует использования входного байта за байтом и сохранения идеальной математической линейности, в то время как xxhash принимает данные полными полосами и специально нарушает линейность, чтобы улучшить распределение битов.
Спасибо за ваше объяснение! Думаю, мне нужно искать другие скользящие хеши.
@ Cyan4973 Поскольку вы также
Не могли бы вы вкратце обрисовать или дать ссылку на методы, которые делают xxHash быстрым и хорошо распространяемым, которые все еще можно применить к скользящим хешам?
Было бы замечательно иметь возможность создать скользящий хеш, например, для rsync
или дедупликации данных в памяти ala bup
, который по производительности приближается к xxHash.
Известные мне скользящие хеши в корне отличаются от xxhash или любого другого высококачественного хеша.
Имхо, эти 2 категории не пересекаются.
Вы слишком узко думаете, @ Cyan4973.
XXH3 определенно может быть скользящим хешем. Только не в традиционном понимании.
Каждые выровненные 1024 байта (один блок, учитывая размер секрета по умолчанию) могут быть вставлены или извлечены. Для этого нужны все 8 аккумуляторов, но это определенно выполнимо.
Что ж, это правда.
Просто все скользящие хэши, о которых я знаю, имеют гранулярность на уровне байтов, и приложениям, которые их используют, как правило, требуется этот уровень гранулярности (обнаружение гибких точек отсечения в более крупном документе довольно распространено).
Гранулярность на уровне КБ действительно возможна с XXH3,
хотя для этого потребуется приложение, способное использовать преимущества этого уровня детализации.
Кроме того, это не так просто, как обычный скользящий хеш,
где RH(p, p+N) = H(RH(p-1, p+N-1), p+N) - h(p-1)
.
Для XXH3, поскольку нет линейности, по-прежнему необходимо рекомбинировать и скремблировать все переваренные фрагменты размером 1 КБ в правильном порядке.
Это все еще меньше работы, чем повторная обработка всего ввода, но рабочая нагрузка линейно увеличивается с размером обрабатываемого сегмента.