【问题标题】:Detecting and reducing duplicate binary files stored in SQL检测和减少存储在 SQL 中的重复二进制文件
【发布时间】:2013-05-28 16:13:14
【问题描述】:

在我们的应用程序中,我们让用户通过它生成和发送各种各样的文档。其中一些将始终是唯一的,但其中很大一部分将是静态的。我们使用 FileStream 将文件存储在 SQL 2008 DB 中以存储实际数据。我正在寻找一种方法来检测文件何时已存储,因此我不存储重复文件。

我正在考虑生成一个散列,使用 MD5 并将该散列用作 SQL 数据库的键。我害怕的是发生碰撞的可能性。

我的一些问题是:

1:在哈希上发生冲突的可能性是多少?我应该将唯一键视为文件名、文件大小和哈希的组合吗?

2:你会将生成的哈希存储在数据库中吗?我们应该将它存储为二进制字段吗?

【问题讨论】:

  • 存储一个哈希,如果匹配,验证文件的内容。您只需要检查插入和更新,并且匹配应该很少见。 (查看 Wikipedia 或其他资源,了解各种哈希算法发生冲突的可能性。)只是不要创建哈希列 unique

标签: c# sql-server md5


【解决方案1】:

这是非常常见的面试问题之一 - 所以应该进行大量长时间的讨论:)。

  1. birthday paradox - 相对较高。但是一些可以在恒定时间内获得的数据(如大小、第一个/最后一个 X 字节)可以使“散列”更长,因此更容易接受碰撞概率。我会使用产生更长哈希(Sha256?)的东西开始。

  2. 我会使用 Base64 字符串的 Sha256 哈希 + 任何其他有用的位(或任何其他可索引字段,我认为二进制不是)。

旁注我不会将文件名用作“哈希”的一部分,因为它不是二进制数据本身的一部分,并且可以独立更改。

【讨论】:

  • 谢谢,我已经倾向于 Base64,并且考虑碰撞 SHA256 的机会明显更少,这更有意义....我有资源进行更长的计算
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 2019-08-20
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多