2009-04-16 30 views
6

我们有一个定价数据集,用于更改包含的值或记录数。与值的变化相比,添加或删除记录的数量较少。数据集通常有50到500个项目和8个属性。检测数据变化的最佳散列函数?

我们目前使用AJAX返回表示数据集的JSON结构,并使用此结构更新网页并使用新值并在必要时删除或添加项目。

我们用两个哈希值进行请求,一个用于值,另一个用于记录。这些是使用JSON结构返回的MD5哈希值,并随后发送请求。如果哈希值发生变化,我们知道我们需要一个新的JSON结构,否则哈希值会返回以节省带宽并消除不必要的客户端处理。

由于MD5通常与加密一起使用,是检测数据变化的哈希算法的最佳选择?

还有哪些方法可以检测到值的更改和更新,以及检测添加或删除的项目以及相应地操作页面DOM?

回答

10

MD5是检测一组数据变化的合理算法。但是,如果您不关心加密属性,并且非常关心算法的性能,则可以使用更简单的校验和样式算法,该算法不是用于加密安全的。 (尽管近几年发现了MD5中的弱点,但它仍然被设计为加密安全,因此比您的场景可能需要做更多的工作)。

但是,如果您对MD5的计算性能感到满意,我会坚持下去。

-3

我认为任何常用的散列函数都会做你想要的 - 提供一个实体的唯一表示。

对于您尝试解决的问题,我的解决方案是使用后端表来记录所有更改。不是更改本身,而是已更改行的标识符。定期回调服务器并获取所有已更改对象的列表,并使用此列表来确定哪些行需要更新/删除/添加。

+1

这是一个普遍的误解。散列函数不“提供实体的唯一表示”。实际上,对于域大于其范围的散列函数,保证不是这种情况。 – recursive 2009-04-16 14:44:35

0

你在做什么听起来很不错。

如果服务器端容量很便宜并且最小化网络使用率至关重要,那么您可以让服务器记住每个客户端的最后一个数据集是什么,并只发送差异(作为插入,删除和编辑列表)在每个请求上。如果您首先对数据行进行排序,则可以使用差分算法(例如diff使用的算法)来高效计算这些差异。

此方法对网络中断非常敏感 - 如果客户端没有收到响应,则错误将会累积。但是,这可以通过让客户端发送MD5哈希来解决:如果它与服务器期望的不同,将发送整个列表而不是一系列更改。

4

MD5就好了。如果性能太低,则可以尝试快速校验和算法,例如Adler-32

0

我同意Jonathan关于MD5的回答。至于检测更改的其他方法,如果您愿意在服务器上存储(或已经存储)最近更改的时间/日期,则可以将其反复传递给客户端。您完全避免了计算,您甚至可以使用大部分现有代码。

-
BMB