Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较客户机/服务器之间的2个大字符串数组_Java_Algorithm - Fatal编程技术网

Java 比较客户机/服务器之间的2个大字符串数组

Java 比较客户机/服务器之间的2个大字符串数组,java,algorithm,Java,Algorithm,我有一个大字符串数组,它包含24-32个随机字符(包括0123456789abcdefghijklmnopqrstuvwxyz!@$%^&*()+=-[]';/,?}{)。有时数组是空的,但有时数组中有1000多个元素 每次他请求它们时,我都会通过AJAX将它们发送给我的客户端,这是一个浏览器。我只想在数组不同的情况下重新加载我的应用程序的一部分。这意味着如果有修改,在所述数组中添加/删除。所以我想发送整个数组,以及其中所有元素的某种散列。我不能使用md5或任何东西这是因为数组中的元素可能会四处

我有一个大字符串数组,它包含24-32个随机字符(包括
0123456789abcdefghijklmnopqrstuvwxyz!@$%^&*()+=-[]';/,?}{
)。有时数组是空的,但有时数组中有1000多个元素

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


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

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

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

服务器维护一个版本号或散列码,每当字符串更改时,服务器都会更新该版本号或散列码。如果服务器收到请求,并且客户端的版本与当前版本相同,则服务器将返回一个结果,表明“您已经拥有当前版本”

这里的要点有两个:防止传输您不需要传输的信息,以及防止客户端必须计算哈希代码


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

我建议使用一种系统,如果客户端具有最新版本,则允许您完全跳过发送字符串。客户端保留n收到的最新版本的编号(或哈希代码)。如果尚未收到任何字符串,则可以默认为0

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

服务器维护一个版本号或散列码,每当字符串更改时,服务器都会更新该版本号或散列码。如果服务器收到请求,并且客户端的版本与当前版本相同,则服务器将返回一个结果,表明“您已经拥有当前版本”

这里的要点有两个:防止传输您不需要传输的信息,以及防止客户端必须计算哈希代码


如果服务器需要在每次请求时计算散列,而不是只保留当前的散列码值,请让服务器先对字符串数组排序,然后执行MD5或CRC或其他操作。

您确定在您的用例中传输1000个字符实际上是个问题吗?例如,此stackoverflow页面当前有17000字节大,并且stackoverflow只在它发生更改时才进行传输。换言之,传输1000个字符大约需要1000字节,或者在1 MBit连接上需要1毫秒(按照现代标准,这是很慢的;-)

这就是说,只有在数据发生变化时才传输数据是一种基本的优化策略,它已被纳入HTTP标准本身。HTTP标准描述了基于时间和基于etag的失效,并由几乎任何使用HTTP进行交互的软件或硬件(包括浏览器和CDN)实现。了解more、 读一本或一本书


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

您确定在您的用例中传输1000个字符实际上是一个问题吗?例如,此stackoverflow页面当前有17000字节大,并且stackoverflow仅在其发生更改时才进行传输。换句话说,传输1000个字符将需要大约1000字节,或者在1 MBit连接上传输1毫秒(以现代标准来看,这是缓慢的;-)

这就是说,只有在数据发生变化时才传输数据是一种基本的优化策略,它已被纳入HTTP标准本身。HTTP标准描述了基于时间和基于etag的失效,并由几乎任何使用HTTP进行交互的软件或硬件(包括浏览器和CDN)实现。了解more、 读一本或一本书


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

你是说1000+字符串的顺序不相关吗?
[“aaa”、“foo”、“xyz”]
[“xyz”、“aaa”、“foo”]
相同,但不同于
[“aaa”、“foo”、“bar”]
。如果是这样,那么对它们进行排序并使用MD5。@Andreas是的。因此[“aa”、“aa”、“cc”]的“散列”应该是相同的和
[“bb”、“cc”、“aa”]
由于顺序无关紧要,对它们进行排序也无关紧要,除非排序后的数组的MD5将保持一致,即使原始顺序不同。是始终保持数组的排序,还是只是暂时对MD5进行排序取决于您自己。@Andreas我想了想,但排序可能会很昂贵,我更喜欢这样做可伸缩,因为我以后可能会响应很多请求。因此我建议保持数组排序,这样您就不必一直重复它。您甚至可能希望缓存MD5哈希。您是说1000+字符串的顺序是