确定文件标识的算法(优化)

Sam*_*ron 6 c# optimization identity

继这个问题:用于确定文件身份的算法

回顾:我正在寻找一种用于确定文件标识的廉价算法,该算法在绝大多数情况下都有效.

我继续实施了一个算法,它为每个文件提供了" 非常独特 "的哈希值.

我的算法的工作方式是:

  • 对于小于特定阈值的文件,我使用标识哈希的完整文件内容.

  • 对于大于阈值的文件,我采用X大小的随机N个样本.

  • 我在散列数据中包含了文件大小.(意味着所有具有不同大小的文件会导致不同的哈希值)

问题:

  • 我应该为N和X选择什么值(我应该选择多少随机样本的大小?)我选择了4个样本,每个样本8K,并且无法算法算法.我发现增加样本量会迅速降低算法的速度(导致搜索非常昂贵)

  • 数学一:我的文件需要多少才能让这个算法爆炸.(2个具有相同长度的不同文件最终具有相同的哈希值)

  • 优化之一:有没有什么方法可以优化我的具体实现来提高吞吐量(我似乎能够在我的系统上每秒做大约100个文件).

  • 这个实现看起来是否合理?你能想到任何真实世界的例子吗?(我的重点是媒体文件)

相关信息:

我实现的算法

谢谢你的帮助!

Pas*_*nen 1

  • 始终在哈希中包含第一个和最后一个文件块。

这是因为它们很可能因文件而异。如果您考虑 BMP,它可能具有相当标准的标头(如 800x600 图像、24 位、空休息),因此您可能需要稍微超出标头以获得差异化数据。问题是标题的大小差异很大。

最后一个块用于将数据附加到原始文件格式。

  • 读取您使用的文件系统固有大小的块,或者至少能被 512 整除。
  • 始终以可被块大小整除的偏移量读取块。
  • 如果您对相同大小的文件获得相同的结果,请对其进行深度扫描(散列所有数据)并记住文件路径,以免再次扫描它。

即使如此,除非你很幸运,否则你会错误地将某些文件识别为相同的文件(例如 SQL Server 数据库文件,仅在几次插入后它就是 1:1 备份副本;除了 SS 确实写入了时间戳..)