Сравнение больших строк в JavaScript с хешем

У меня есть форма с текстовым полем, которое может содержать большое количество контента (например, статьи для блога), отредактированное с использованием одного из нескольких сторонних текстовых редакторов. Я пытаюсь реализовать что-то вроде функции автосохранения, которая должна отправлять контент через ajax, если он изменился. Тем не менее, мне нужно обойти тот факт, что некоторые редакторы, которые у меня есть в качестве параметров, не поддерживают флаг "isdirty" или событие "onchange", которое я могу использовать, чтобы увидеть, изменился ли контент со времени последнего сохранения.

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

Было бы более эффективно хранить какой-то хэш в переменной lastSaveContent вместо целой строки, а затем сравнивать значения хэша? Если да, можете ли вы порекомендовать хорошую библиотеку javascript/плагин jquery, который реализует соответствующий хеш для этого требования?

Ответ 1

Короче говоря, вам лучше всего хранить и сравнивать две строки.


Вычисление правильного хеша не дешево. Например, проверьте псевдокод или фактическую реализацию JavaScript для вычисления хеша MD5 строки. Кроме того, все правильные реализации хэша потребуют перечислить символы строки в любом случае.

Кроме того, в контексте современных вычислений строка должна быть действительно, действительно задолго до того, как сравнивать ее с другой строкой медленно. То, что вы здесь делаете, - это, по сути, микро-оптимизация. Память не будет проблемой, и CPU не будет сравнивать две строки.

Как и во всех случаях оптимизации: проверьте, что на самом деле это проблема, прежде чем вы ее решаете. В ходе быстрого теста я сделал, вычисление и сравнение 2 MD5 сумм заняло 382ms. Сравнение двух строк напрямую заняло 0 мс. Это использовало строку длиной 10000 слов. См. http://jsfiddle.net/DjM8S.

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

..

Ответ 2

Хеш MD5 часто используется для проверки целостности файла или документа; он должен работать в ваших целях. Здесь хорошая статья о генерации хэша MD5 в Javascript.

Ответ 3

Я сделал JSperf rev, который может быть полезен здесь для измерения производительности. Пожалуйста, добавьте разные версии и различные типы проверок к тем, которые я сделал!

http://jsperf.com/long-string-comparison/2

Я нашел два основных результата

  • Когда строки идентичны, производительность убита; от ~ 9000000 ops/s до ~ 250 ops/sec (хром)
  • 64-разрядная версия IE9 на моем ПК медленнее , что является результатом тех же тестов:

    +------------+------------+
    | IE9 64bit  |  IE9 32bit |
    +------------+------------+
    | 4,270,414  | 8,667,472  |
    | 2,270,234  | 8,682,461  |
    +------------+------------+
    

К сожалению, jsperf зарегистрировал оба результата как просто "IE 9".

Даже предварительный взгляд на производительность JS MD5 говорит мне, что он очень, очень медленный (по крайней мере для больших строк, см. http://jsperf.com/md5-shootout/18 - пики при 70 ops/sec). Я хотел бы зайти так далеко, чтобы попробовать AJAXing хэш-расчет или сравнение с бэкэнд, но у меня нет времени на тестирование, извините!