我有一个 WCF 服务,它接收 XML 文件(在字符串参数中)进行处理。现在我想实现一个错误日志程序。我想在发生异常时记录异常,以及生成错误的 XML 文件。
我为此创建了一个 MySQL 数据库,文件将存储在一个长 blob 字段中。
我的疑问是如何避免存储文件的表中的重复性,因为用户可以多次提交相同的文件。为了节省存储空间,我想确定已经保存了完全相同的文件,在这种情况下,只需重新使用引用即可。
哪种方法最适合?我的第一个想法是生成一个 Hashcode 并将其保存在表中的另一个字段中,以便以后使用它进行搜索。 在搜索时,我发现有多种算法可用于计算哈希值:
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 ,因此您不能使用它们来可靠地识别文件。 (如果你尝试这样做,你的系统会在一段时间内正常工作,这段时间的长度取决于随机机会和哈希的大小,然后在它确定两个完全不同的文件相同时发生灾难性故障。)
哈希作为机制的第一步可能仍然有用,在该机制中,哈希定位一个可以包含 0..n 个文件的“桶”,并且您可以通过比较完整文件内容来确定实际的唯一性。
由于这是一个哈希算法速度为正的应用程序,我会使用 MD5。
关于mysql - 我应该使用哪种哈希算法来检查文件重复性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33480925/