将JavaScript中的大字符串与散列进行比较

时间:2010-03-23 18:40:43

标签: javascript string hash

我有一个带有textarea的表单,其中包含使用众多第三方富文本编辑器之一编辑的大量内容(例如,博客文章)。我正在尝试实现类似自动保存功能的东西,如果它被更改,它应该通过ajax提交内容。但是,我必须解决这样一个事实:我作为选项的一些编辑器不支持“isdirty”标志,或者“onchange”事件,我可以用它来查看自上次保存以来内容是否已更改。

所以,作为一种解决方法,我想做的是将内容的副本保存在变量中(让我们称之为lastSaveContent),从最后一次保存开始,并在“自动保存”时将其与当前文本进行比较“函数触发(在计时器上)以查看它是否不同。但是,我担心可能会占用大量文档的内存量。

在lastSaveContent变量中存储某种散列而不是整个字符串会更高效,然后比较散列值吗?如果是这样,你能推荐一个好的javascript库/ jquery插件,为这个要求实现适当的哈希吗?

3 个答案:

答案 0 :(得分:21)

简而言之,你最好只存储和比较两个字符串。


计算正确的哈希便宜。例如,请查看pseudo codeactual JavaScript implementation以计算字符串的MD5哈希值。此外,所有正确的哈希实现都需要枚举字符串的字符。

此外,在现代计算环境中,字符串必须真正真正很长时间才能将它与另一个字符串进行比较。你在这里做的实际上是微观优化。内存不会成为问题,CPU也不会循环比较两个字符串。

与所有优化案例一样:检查,在解决问题之前实际上是一个问题。在我做的快速测试中,计算和比较2个MD5总和需要382ms。直接比较两个字符串需要0ms。这是使用10000字长的字符串。请参阅http://jsfiddle.net/DjM8S

如果你真的认为这是一个问题,我也会强烈考虑使用穷人比较;并且只是比较两个字符串的长度,看看它们是否已经改变,而不是实际的字符串比较。

.

答案 1 :(得分:4)

MD5哈希通常用于验证文件或文档的完整性;它应该适合您的目的。 Here是一篇关于在Javascript中生成MD5哈希的好文章。

答案 2 :(得分:1)

我制作了一个JSperf rev,可能在这里用于性能测量。请为我制作的那些添加不同的修订版和不同类型的支票!

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

我发现了两个主要结果

  • 当字符串相同时,表演被谋杀;从〜9000000 ops / s到~250 ops / sec(chrome)
  • 在我的电脑上,IE9的64位版本太多较慢,来自相同的测试结果:

    +------------+------------+
    | 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进行哈希计算或与后端进行比较,但我没有时间进行测试,抱歉!

相关问题