在客户端/服务器之间比较2个大字符串数组

时间:2016-08-29 21:13:20

标签: java algorithm

我有一个大字符串数组,其中包含24-32个随机字符(包括0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+=-[]';/.,<>?}{)。有时候数组是空的,但有时候数组里面有超过1000个元素。

我每次请求时都通过AJAX将它们发送到我的客户端,这是一个浏览器,我只想在该数组不同的情况下重新加载应用程序的一部分。这意味着如果有修改,在所述阵列中添加/删除。所以我想发送整个数组,以及其中所有元素的某种哈希值。我不能使用md5或类似的东西,因为数组中的元素可能会移动。

你建议我做什么?服务器使用Java来提供页面。

2 个答案:

答案 0 :(得分:2)

您确定在您的用例中传输1000个字符实际上是个问题吗?例如,此stackoverflow页面当前大17000字节,stackoverflow不会努力仅在它已更改时才传输它。换句话说,传输1000个字符将需要大约1000个字节,或1 MBit连接上的1 ms(按现代标准来说这很慢; - )。

也就是说,仅在数据发生变化时才传输数据是一种基本的优化策略,它已被纳入HTTP标准本身。 HTTP标准描述了基于时间和基于etag的失效,并且实际上由使用HTTP交互的任何软件或硬件实现,包括浏览器和CDN。要了解详情,请阅读tutorial by Googlenormative specification

您可以通过指定固定生存期或解释If-Modified-Since标头来使用基于时间的失效。您还可以使用对排序不敏感的ETag,方法是在散列之前将元素放入特定顺序(例如通过排序)。

答案 1 :(得分:0)

如果客户端有最新版本,我会建议一个允许你完全跳过发送字符串的系统。客户端保留其收到的最新版本的版本号(或哈希码)。如果尚未收到任何字符串,则默认为0。

因此,当客户端需要获取字符串时,它可以说“如果当前版本不是X则给我字符串”,其中X是客户端当前具有的版本。

服务器维护版本号或哈希码,只要字符串发生更改,它就会更新。如果它收到请求,并且客户端的版本与当前版本相同,则服务器返回一个结果,显示“您已经拥有当前版本。”

这里有两点:阻止传输您不需要传输的信息,并防止客户端计算哈希码。

如果服务器需要在每个请求中计算哈希值而不是仅保留当前哈希码值,请让服务器先对字符串数组进行排序,然后执行MD5或CRC或其他任何操作。