在我们的应用程序中,我们让用户通过它生成并发送各种文档。其中一些将始终是唯一的,但其中很大一部分将是静态的。我们使用FileStream将文件存储在SQL 2008 DB中以获取实际数据。我正在寻找一种方法来检测文件何时已经存储,所以我不存储副本。
我正在考虑使用MD5生成哈希,并将该哈希用作SQL数据库的密钥。我担心的是发生碰撞的可能性。
我有一些问题:
1:在哈希上发生冲突的可能性是什么?我应该将唯一键视为FileName,File of File加Hash的组合吗?
2:您将在数据库中存储生成的哈希值?我们应该将它存储为二进制字段吗?
答案 0 :(得分:1)
这是一个非常常见的面试问题 - 所以应该有很多长时间的讨论:)。
birthday paradox - 相对较高。但是一些可以在恒定时间内获得的数据(如大小,第一个/最后一个X字节)可以使“哈希”更长,因此碰撞概率更可接受。我会使用生成更长哈希(Sha256?)的东西开始。
我使用的是Sha646哈希的Base64字符串+其他任何有用的位(或任何其他可索引字段,我相信二进制不是)。
旁注我不会将文件名用作“哈希”的一部分,因为它不是二进制数据本身的一部分,可以独立更改。