2012-09-08 34 views
4

我的問題是這樣的。我有一塊數據。偶爾這個數據塊會被更新,並且會出現一個新的更改版本。我需要檢測我正在查看的數據是否與我期望收到的版本匹配。使用非加密散列來指紋數據塊可以嗎?

我決定使用指紋,這樣我就可以避免全部存儲「預期」版本的數據。似乎這種事情的'默認'選擇是MD5哈希。

但是MD5被設計爲加密安全。有更快的散列函數。我正在研究現代非加密函數,如CityHash和SpookyHash。

因爲我控制一切在我的系統我只在乎意外碰撞,其中數據的改變區塊哈希值相同的值的數據。因此,我不認爲我必須擔心加密哈希的「攻擊者防範」性質,並可能使用更簡單的哈希函數逃脫。

是否有使用哈希函數,如CityHash或SpookyHash此目的的任何問題,或者我應該只是堅持用MD5?還是應該使用專門用於指紋識別的東西,例如拉賓指紋?

回答

0

是的,沒關係(還可以看看更快的CRC系列函數)。不過,我傾向於避免使用散列來區分數據,使用序列號與日期/時間值結合提供了一種方法來確定哪個版本更新,並檢測不同步的更改。指紋用於檢測損壞的文件而不是版本。

如果你想一組數據的比較與另一個,則不要使用哈希/指紋,只是將數據直接比較。比較兩個流的速度要快於兩個流的哈希,然後比較哈希值。

這就是說,作爲一個快速的方法來比較大量的文件就是要把每個文件的哈希值,然後比較哈希值,而當有一個哈希匹配你再比較原始字節。發生哈希碰撞的可能性確實很小,但這並非不可能 - 我也絕對確定。

0

您可能需要使用拉賓哈希,這是更快,更碰撞比密碼散列,如MD5,SHA1等彈性。 Java實現可以在here找到。網絡規模公司的大多數大規模重複數據刪除工作都利用Rabin Hash(例如,參見Google's efforts led by Henzinger

相關問題