file - 可以使用非加密哈希来对数据 block 进行指纹识别吗?

标签 file hash

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

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

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

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

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

最佳答案

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

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

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

关于file - 可以使用非加密哈希来对数据 block 进行指纹识别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334379/

相关文章:

python - Python 中 Windows 路径中的双反斜杠错误

linux - 检测到文件已关闭

string - 如果两个键相同但值不同,谁能解释如何打印所有键?

python - 在 Python 中计算对象的哈希值

perl - Perl 中的哈希键可以有多个 'subvalues' 吗?

c - fchmod 之后写入的预期行为是什么?

c# - SaveFileDialog 上的自定义检查文件名

c# - 如何即时创建一个包含所有表的新 SQLite 数据库?

ruby-on-rails - 在 Ruby 中使用注入(inject)?

java - 如何创建一个哈希表来比较类中的部分实例变量是否曾经出现过?