我的问题是这个。我有一块数据。有时会更新此数据块并显示新的更改版本。我需要检测我正在查看的数据是否与我期望收到的版本相匹配。
我决定使用指纹,这样我就可以避免完整存储“预期”版本的数据。似乎这种事情的'默认'选择是MD5哈希。
然而,MD5被设计为加密安全。散列函数有更快的速度。我正在研究现代的非加密函数,例如CityHash和SpookyHash。
由于我控制了系统中的所有数据,我只关心意外碰撞,其中更改的数据块散列到相同的值。因此,我认为我不必担心加密哈希的“攻击者证明”性质,并且可以使用更简单的哈希函数。
为此目的使用诸如CityHash或SpookyHash之类的哈希函数是否有任何问题,或者我应该坚持使用MD5?或者我应该使用专门用于指纹识别的东西,如拉宾指纹?
答案 0 :(得分:1)
是的,没关系(另外看看更快的CRC系列功能)。但是,我倾向于避免使用哈希来区分数据,使用序列号与日期/时间值相结合,提供了一种确定哪个版本更新并检测不同步更改的方法。指纹更多地用于检测损坏的文件而不是版本控制。
如果要将一组数据与另一组数据进行比较,则不要使用散列/指纹,只需直接比较数据即可。比较两个流比获取两个流的哈希值然后比较哈希值更快。
也就是说,比较大量文件的一种快速方法是获取每个文件的哈希值,然后比较哈希值,当有哈希匹配时,则比较原始字节。哈希碰撞的可能性确实很小,但这并非不可能 - 而且我喜欢绝对确定。
答案 1 :(得分:1)
你可能想要使用Rabin Hash,它比密码哈希(如MD5,SHA1等)更快,更具碰撞弹性。可以找到Java实现here。 Web规模公司的大多数大规模重复数据删除工作都使用Rabin Hash(例如,请参阅Google's efforts led by Henzinger