【问题标题】:Comparing large strings in JavaScript with a hash将 JavaScript 中的大字符串与哈希值进行比较
【发布时间】:2014-09-15 16:49:25
【问题描述】:

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

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

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

【问题讨论】:

  • 这可能几乎不会发生在您的用例中,但是对于碰巧在这里搜索 javascript 和散列的临时读者(比如我)来说,比较两个散列值可能值得注意与比较两个字符串相同,散列可能(并且将会)发生冲突,即 .. 两个不同字符串的相同散列。因此,在许多用例中,如果你得到相同的哈希值,你应该执行一个完整的比较。
  • 好点。此外,如果那些读者想知道,Hashtable 对象(例如在许多集合 API 中发现的对象)仍然有效的原因是它们包含在两个键产生相同哈希时处理这些冲突的功能。

标签: javascript string hash


【解决方案1】:

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


计算正确的散列并不便宜。例如,查看 pseudo codeactual JavaScript implementation 以计算字符串的 MD5 哈希。此外,所有正确的哈希实现无论如何都需要枚举字符串的字符。

此外,在现代计算的背景下,一个字符串必须是真的真的,然后才能将它与另一个字符串进行比较很慢。你在这里所做的实际上是一个微优化。内存不是问题,比较两个字符串的 CPU 周期也不是问题。

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

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

..

【讨论】:

  • 好吧,假设用户想发布小说的一章。文章需要多长时间才能考虑到“大量圣经摘录”的长度?
  • 对字符串进行 MD5 处理,然后将其与“以前的”md5 总和进行比较,需要 382 毫秒。基本字符串比较耗时 0ms;这是使用约 10000 字长的字符串。 (jsfiddle.net/DjM8S)
  • 谢谢。这是两者中更好的答案,也是我正在寻找的那种答案(尽管另一个答案也很丰富)。我会投赞成票,但显然作为一个新用户,我没有足够的声誉。
【解决方案2】:

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

【讨论】:

  • 有用的信息,但如果我不需要像其他答案所建议的那样打扰这个,那么我必须维护的代码会少一些。
【解决方案3】:

我制作了一个 JSperf rev,它可能对性能测量有用。请为我所做的添加不同的修订和不同类型的检查!

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

我发现了两个主要结果

  • 当字符串相同时,性能被谋杀;从 ~9000000 ops/s 到 ~250 ops/sec (chrome)
  • IE9 的 64 位版本在我的 PC 上要慢得多,结果来自相同的测试:

    +------------+------------+
    | 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 次操作/秒)。我想尝试 AJAXing 哈希计算或与后端的比较,但我没有时间测试,抱歉!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 2016-02-23
    • 1970-01-01
    • 2011-03-27
    • 2017-03-27
    • 1970-01-01
    • 2013-12-21
    • 2016-01-24
    相关资源
    最近更新 更多