Сравнение больших строк в 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 хэш-расчет или сравнение с бэкэнд, но у меня нет времени на тестирование, извините!