Лучшая хеш-функция для обнаружения изменений данных? - PullRequest
7 голосов
/ 16 апреля 2009

У нас есть набор данных о ценах, который изменяет содержащиеся в нем значения или количество записей. Количество добавленных или удаленных записей мало по сравнению с изменениями в значениях. Набор данных обычно содержит от 50 до 500 элементов с 8 свойствами.

В настоящее время мы используем AJAX, чтобы вернуть структуру JSON, которая представляет набор данных, и обновить веб-страницу, используя эту структуру, с новыми значениями и, где необходимо, удалить или добавить элементы.

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

Поскольку MD5 обычно используется с шифрованием, является ли лучшим выбором алгоритм хеширования для обнаружения изменений данных?

Какими альтернативными способами мы можем обнаружить изменение значений и обновить их, а также обнаружить добавленные или удаленные элементы и соответствующим образом манипулировать DOM страницы?

Ответы [ 5 ]

11 голосов
/ 16 апреля 2009

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

Однако, если вы довольны вычислительной производительностью MD5, я бы просто придерживался ее.

4 голосов
/ 16 апреля 2009

MD5 просто отлично. Если он имеет слишком низкую производительность, вы можете попробовать быстрый алгоритм контрольной суммы, такой как, например, Adler-32 .

0 голосов
/ 16 апреля 2009

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

-
BMB

0 голосов
/ 16 апреля 2009

То, что ты делаешь, звучит довольно хорошо для меня.

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

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

0 голосов
/ 16 апреля 2009

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

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

...