2012-03-11 93 views
0

我想編寫一個獲取url列表的應用程序。使用哈希func監視html變化

對於他們每個人,我需要定期監視內容是否發生了變化。

心想:(?任何其他建議)

  1. 使用HtmlAgilityPack獲取html內容

  2. 我並不需要當場變化本身,

所以我通過散列內容,將它保存在DB

並重新比較h如同將來一樣。

你會如何建議散列? .net的GetHashCode()?

我看到這個文件http://support.microsoft.com/kb/307020

其勸使用

tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); 

爲什麼呢?

回答

0

你應該絕對不是使用GetHashCode()爲此。該documentation明確規定:

此外,.NET Framework不保證GetHashCode方法的默認實現,它返回值將是不同版本的.NET Framework之間的相同。

GetHashCode結果可以運行之間的改變 - 所有這一切保證的是,調用它的兩個相等的對象在同一進程(可能的AppDomain)將給予相同的散列碼。實際上,String.GetHashCode的算法已經隨時間變化,而在.NET 4中,32位實現與64位實現不同。

如果要使用散列,請使用MD5,SHA1等 - 使用指定的算法,其中不會更改。 (請注意,這些操作對二進制數據而不是字符串數據,這可能更合適 - 您不需要打擾將數據解碼爲文本。)

我不清楚定期復讀是否是真的是儘管最好的想法 - 這些服務器不支持最後修改時間,etags等?

+0

「做這些服務器......」的主機網頁?我不能指望它,但我可以把它作爲流程在我的檢查 – 2012-03-11 12:01:46

+0

@EladBenda:是的 - 如果你可以使用它來避免反覆下載,這將有很大幫助。 – 2012-03-11 12:06:17

+0

誰負責更新電子標籤?網站所有者?或者它是透明地完成的? – 2012-03-11 12:06:52

0

正如您所要求的建議。我會用這種方法代替

WebClient client = new WebClient(); 
String htmlCode = client.DownloadString("http://google.com"); 

而且我會把這個字符串保存在我的數據庫中。在特定的時間間隔後,我可以再次比較它們。

但是,我同意字符串的大小真的很大。 如果我只是想獲得有關事實的內容已經改變了一些如何的警報。我會使用MD5。由於MD5字符串的結果大小隻有27個字符。

因此,比較容易比較和存儲在數據庫中

+0

- 實際上包含哈希?這意味着它保持一對一的唯一性? – 2012-03-11 11:52:44

+0

MD5哈希,*不*加密。不,它不是1:1,因爲這不是哈希的意思。這意味着它是唯一性的一個很好的指標*,而不是保證。 – 2012-03-11 12:05:56

+0

我同意你的看法。但是,無論是哪種情況,只要值發生變化,您都可以輕鬆地比較更改。 – MDMalik 2012-03-11 12:07:33