我的问题是。我有一块数据。有时,此数据块会更新,并且会出现新的更改版本。我需要检测我正在查看的数据是否与我期望收到的版本相匹配。
我决定使用指纹,这样我就可以避免存储完整的“预期”版本的数据。这类事情的“默认”选择似乎是MD5散列。
但是,MD5被设计为加密安全的。还有更快的散列函数。我正在研究像CityHash和SpookyHash这样的现代非加密函数。
因为我控制系统中的所有数据,所以我只关心意外冲突,即更改后的数据块散列为相同的值。因此,我认为我不必担心加密散列的“防攻击者”特性,并且可以使用更简单的散列函数。
使用散列函数(如CityHash或SpookyHash )来实现此目的有什么问题吗?还是应该坚持使用MD5?或者我应该使用专门为指纹识别设计的东西,比如Rabin指纹?
发布于 2012-09-09 04:57:27
是的,这是可以的(还可以看看更快的CRC系列函数)。但是,我倾向于避免使用散列来区分数据,使用序列号和日期/时间值相结合提供了一种确定哪个版本较新以及检测不同步更改的方法。指纹更多地用于检测损坏的文件,而不是版本控制。
如果你想比较一组数据与另一组数据,那么不要使用散列/指纹,直接比较数据即可。比较两个流比获取两个流的散列,然后比较散列要快得多。
也就是说,比较大量文件的一个很好的快速方法是获取每个文件的散列,然后比较散列,当存在散列匹配时,再比较原始字节。哈希冲突的可能性确实很小,但这并不是不可能的-我喜欢绝对确定。
发布于 2013-10-24 04:50:58
您可能想要使用Rabin散列,它比MD5、SHA1等加密散列更快、更具抗冲突能力。一个Java实现可以在here找到。web规模公司的大多数大规模重复数据消除工作都使用拉宾散列(例如,请参见Google's efforts led by Henzinger
https://stackoverflow.com/questions/12334379
复制相似问题