【问题标题】:Is it okay to use a non-cryptographic hash to fingerprint a block of data?可以使用非加密哈希对数据块进行指纹识别吗?
【发布时间】:2012-09-08 20:50:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: file hash


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-02-16
        • 2018-10-23
        • 2019-04-21
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 2015-10-06
        • 1970-01-01
        相关资源
        最近更新 更多