我应该使用哪种哈希算法来检查文件重复性

Which Hash algorithm should I use to check for file duplicity

我有一个 WCF 服务,它接收 XML 个文件(在字符串参数中)进行处理。现在我想实现一个错误日志程序。我想在发生异常时记录异常,以及生成错误的 XML 文件。

我已经创建了一个 MySQL 数据库来执行此操作,文件将存储在一个长 blob 字段中。

我的疑问是如何避免存储文件的 table 中的口是心非,因为用户可以多次提交相同的文件。为了节省存储空间space,我想确定已经保存了完全相同的文件,在这种情况下,只需重新使用引用即可。

哪种方法最适合?我的第一个想法是生成一个 Hashcode 并将其保存在 table 中的另一个字段中,以便以后可以使用它进行搜索。 在搜索时,我发现有多种算法可用于计算哈希值:

System.Security.Cryptography.KeyedHashAlgorithm
System.Security.Cryptography.MD5
System.Security.Cryptography.RIPEMD160
System.Security.Cryptography.SHA1
System.Security.Cryptography.SHA256
System.Security.Cryptography.SHA384
System.Security.Cryptography.SHA512

哪个更好?使用其中之一来确定文件是否重复是否安全?使用此方法或 .GetHashCode() 函数有什么区别?

所有哈希本质上都具有 collisions,因此您不能使用它们来可靠地识别文件。 (如果您尝试这样做,您的系统将在一段时间内正常工作,这段时间的长度取决于随机机会和哈希的大小,然后在它确定两个完全不同的文件相同时发生灾难性故障。)

散列作为机制的第一步可能仍然有用,在该机制中,散列定位一个 "bucket" 可以包含 0..n 个文件,您可以通过比较完整文件内容来确定实际的唯一性。

由于这是散列算法速度为正的应用程序,我会使用 MD5。