2012-09-08 39 views
4

我的问题是这样的。我有一块数据。偶尔这个数据块会被更新,并且会出现一个新的更改版本。我需要检测我正在查看的数据是否与我期望收到的版本匹配。使用非加密散列来指纹数据块可以吗?

我决定使用指纹,这样我就可以避免全部存储“预期”版本的数据。似乎这种事情的'默认'选择是MD5哈希。

但是MD5被设计为加密安全。有更快的散列函数。我正在研究现代非加密函数,如CityHash和SpookyHash。

因为我控制一切在我的系统我只在乎意外碰撞,其中数据的改变区块哈希值相同的值的数据。因此,我不认为我必须担心加密哈希的“攻击者防范”性质,并可能使用更简单的哈希函数逃脱。

是否有使用哈希函数,如CityHash或SpookyHash此目的的任何问题,或者我应该只是坚持用MD5?还是应该使用专门用于指纹识别的东西,例如拉宾指纹?

回答

0

是的,没关系(还可以看看更快的CRC系列函数)。不过,我倾向于避免使用散列来区分数据,使用序列号与日期/时间值结合提供了一种方法来确定哪个版本更新,并检测不同步的更改。指纹用于检测损坏的文件而不是版本。

如果你想一组数据的比较与另一个,则不要使用哈希/指纹,只是将数据直接比较。比较两个流的速度要快于两个流的哈希,然后比较哈希值。

这就是说,作为一个快速的方法来比较大量的文件就是要把每个文件的哈希值,然后比较哈希值,而当有一个哈希匹配你再比较原始字节。发生哈希碰撞的可能性确实很小,但这并非不可能 - 我也绝对确定。

0

您可能需要使用拉宾哈希,这是更快,更碰撞比密码散列,如MD5,SHA1等弹性。 Java实现可以在here找到。网络规模公司的大多数大规模重复数据删除工作都利用Rabin Hash(例如,参见Google's efforts led by Henzinger

相关问题