2009-04-16 33 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