检测和减少存储在SQL中的重复二进制文件

本文关键字:二进制文件 SQL 存储 检测 | 更新日期: 2023-09-27 18:15:48

在我们的应用程序中,我们让用户通过它生成和发送各种各样的文档。其中一些将永远是独特的,但其中很大一部分将是静态的。我们使用FileStream存储实际数据,将文件存储在SQL 2008数据库中。我正在寻找一种方法来检测当一个文件已经被存储,所以我不存储一个副本。

我正在考虑生成一个哈希,使用MD5并使用该哈希作为SQL数据库的关键。我担心的是发生碰撞的可能性。

我有几个问题:

1:哈希发生碰撞的可能性是多少?我是否应该将唯一键视为文件名,文件大小加上哈希的组合?

2:您将以什么方式存储结果哈希到数据库中?我们应该把它存储为二进制字段吗?

检测和减少存储在SQL中的重复二进制文件

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

  1. 生日悖论-所以相对较高。但是一些可以在恒定时间内获得的数据(如大小,第一个/最后一个X字节)可以使"哈希"更长,因此碰撞概率更可接受。我将使用产生更长的哈希(Sha256?)的东西开始。

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

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