Сравнение больших строк в JavaScript с хешем - PullRequest
11 голосов
/ 23 марта 2010

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

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

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

Ответы [ 3 ]

21 голосов
/ 23 марта 2010

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


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

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

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

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

..

4 голосов
/ 23 марта 2010

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

1 голос
/ 14 мая 2013

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

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

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

  • Когда строки идентичны, производительностьубит;от ~ 9000000 операций в секунду до ~ 250 операций в секунду (хром)
  • 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 вычисление хеша или сравнение с бэкэндом, но у меня нет времени на тестирование, извините!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...