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

标签 mysql hash hashcode

我有一个 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/

相关文章:

具有雪崩效应的java字符串哈希函数

java - 如何在其成员排序的intellij中生成java的hashcode方法?

c# - 通过哈希码获取对象

java - 什么时候在 Java 中实现 comparable 以及什么时候实现 equals

mysql - 来自服务器的错误 (RequestEntityTooLarge) : Request entity too large: limit is 3145728 while creating a configMap

mysql - 在SQL中评估相关子查询

mysql - 从一个mysql数据库复制到另一个数据库并将表数据分离到不同的表中

hash - 多值哈希 Common Lisp

python - 如何使用 sqlalchemy 截断和插入同一事务?

ruby - 将包含键迭代的数组应用于哈希