我有一个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()函数有什么区别?
答案 0 :(得分:2)
所有哈希本质上都有collisions,因此您无法使用它们来可靠地识别文件。 (如果你尝试,你的系统似乎会运行一段时间,那个时间的长度取决于随机机会和散列的大小,在它决定两个完全不同的文件时灾难性地失败之前是相同的。)
哈希可能仍然有用,作为哈希定位可以包含0..n文件的“存储桶”的机制的第一步,并且您可以通过比较完整文件内容来确定实际唯一性。
由于这是一个哈希算法速度为正的应用程序,我会使用MD5。