Лучшая Хеш-функция для обнаружения изменений данных?

Если вы не возражаете против изменения дерева параметров на месте , это должно сработать. Обратите внимание, что он вернет null, если вы попытаетесь удалить корень.

const tree = { id: 1, name: "Dog", parent_id: null, children: [ { id: 2, name: "Food", parent_id: 1, children: [] }, { id: 3, name: "Water", parent_id: 1, children: [ { id: 4, name: "Bowl", parent_id: 3, children: [] }, { id: 5, name: "Oxygen", parent_id: 3, children: [] }, { id: 6, name: "Hydrogen", parent_id: 3, children: [] } ] } ] };

const removeFromTree = (root, nameToDelete, parent, idx) => {
  if (root.name === nameToDelete) {
    if (parent) {
      parent.children.splice(idx, 1);
    }
    else return null;
  }
  
  for (const [i, e] of root.children.entries()) {
    removeFromTree(e, nameToDelete, root, i);
  }
  
  return tree;
};

console.log(removeFromTree(tree, "Oxygen"));

Ваш текущий код находится на правильном пути. Однако:

newTree = curNode.children.slice(index, index + 1);

выдвигает на первый план несколько проблем: нам нужно манипулировать массивом children родителя, чтобы удалить curNode вместо собственного children массива [116]. Я передаю родительские объекты и дочерний индекс рекурсивно через вызовы, избавляя от проблем линейной операции findIndex.

Кроме того, разрезание от index до index + 1 извлекает только один элемент и не изменяет curNode.children. Не очевидно, как использовать newArray или возвращать его через стек вызовов. splice кажется более подходящим инструментом для решения поставленной задачи: извлечение одного элемента на месте.

Обратите внимание, что эта функция удалит несколько записей, соответствующих nameToDelete.

7
задан Dave Anderson 16 April 2009 в 14:33
поделиться

5 ответов

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

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

11
ответ дан 6 December 2019 в 21:19
поделиться

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

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

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

0
ответ дан 6 December 2019 в 21:19
поделиться

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

4
ответ дан 6 December 2019 в 21:19
поделиться

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

-
BMB

0
ответ дан 6 December 2019 в 21:19
поделиться

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

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

-3
ответ дан 6 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: