5

我的问题是这个。我有一个数据块。有时会更新此数据块并出现新的更改版本。我需要检测我正在查看的数据是否与我期望收到的版本匹配。

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

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

由于我控制系统中的所有数据,因此我只关心更改的数据块散列到相同值的意外冲突。因此,我认为我不必担心加密哈希的“防攻击”性质,并且可以使用更简单的哈希函数。

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

4

2 回答 2

1

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

如果您想将一组数据与另一组数据进行比较,则不要使用哈希/指纹,直接比较数据即可。比较两个流比获取两个流的哈希然后比较哈希更快。

也就是说,比较大量文件的一种快速的好方法是获取每个文件的哈希值,然后比较哈希值,当哈希值匹配时,您再比较原始字节。哈希冲突的可能性确实很小,但这并非不可能 - 我想绝对确定。

于 2012-09-08T20:57:27.053 回答
1

您可能希望使用 Rabin 哈希,它比 MD5、SHA1 等加密哈希更快且更具抗冲突性。可以在此处找到 Java 实现。网络规模公司的大多数大规模重复数据删除工作都使用 Rabin Hash(例如,请参阅由 Henzinger 领导的 Google 的工作)

于 2013-10-23T20:50:58.360 回答