哪种哈希算法可用于重复内容验证?

时间:2011-11-24 19:31:20

标签: java hash md5

我有一个xml文件,我需要确定它是否重复。

我将散列整个xml文件,或者xml文件中的特定xml节点将用于生成某种散列。

md5适合这个吗?

还是其他什么?生成哈希的速度也相当重要,但为唯一数据生成唯一哈希的保证更为重要。

3 个答案:

答案 0 :(得分:8)

MD5被破坏(从某种意义上说它可能故意产生哈希冲突),如果你关心某人,你应该使用SHA系列(例如:SHA-256或SHA-2) em>恶意创建一个与另一个文件具有相同哈希值的文件。


请注意,哈希函数本质上不能保证每个可能输入的唯一哈希值。散列函数的长度有限(例如:MD5的长度为128位,因此有2个 128 可能的散列值)。您无法将潜在的无限域映射到有限的共域,这在数学上是不可能的。

然而,根据birthday paradox,良好散列函数中发生冲突的可能性为1 in 2 n / 2 ,其中n是以位为单位的长度。 (例如:使用128位MD5,即2 64 )。这在统计上是微不足道的,你不必担心意外发生碰撞。

答案 1 :(得分:4)

MD5适用且快速。请注意,一个字符中的单个差异将产生完全不同的MD5。

MD5很可能会为不同的输入生成相同的哈希值。这将是非常罕见的。那么,根据您的输入(您是否期望许多类似的XML或许多不同的XML?),当MD5为您提供肯定匹配时,您可以比较纯字符串内容。

答案 2 :(得分:0)

如果某人可以至少部分地改变某些XML文件的内容,并且某人有一个优势就是让你声明两个相同的XML文件(或XML摘录),而实际上它们不是,那么你需要加密安全散列函数,即抵抗冲突的函数。冲突是一对不同的消息(字节序列),它们产生相同的哈希输出 - 正是您想要避免的。由于哈希函数接受的输入长于其输出,因此必然存在冲突;当没有人能够产生这样的碰撞时,哈希函数被认为是加密安全的。

如果散列函数输出 n 位,则可以预期在散列 2 n / 2 不同消息后发现冲突。安全散列函数是一个散列函数,因此没有任何方法可以比这更快地获得碰撞。

如果没有安全问题(即没有人会主动尝试发现碰撞,你只是担心碰撞运气不好),那么加密弱哈希函数是一个选项,前提是它们有足够大的输出,所以 2 n / 2 仍然比您要比较的XML文件的预期数量大。对于 n = 128 (即 2 n / 2 接近18亿亿),MD5很好,速度快且得到广泛支持。你可能想要调查MD4,它甚至更弱,但也更快一些。如果你想要一个更大的 n ,试试SHA-1,它提供160位输出(此外,SHA-1弱点目前仍然是理论上的,所以SHA-1更少“加密”打破“比MD5”。

如果您有安全问题(甚至可能存在问题),请转到SHA-256。目前,对于该功能,没有关于冲突的加密弱点。如果遇到性能问题(这是不太可能的:在基本的PC上,SHA-256每秒可以处理超过100兆字节的数据,因此很可能XML解析比散列更昂贵),考虑SHA-512 ,在提供64位整数类型的平台上更快一些(但在没有这种类型的平台上速度相当慢)。

请注意,所有这些哈希函数都是关于字节序列的。单个翻转位会改变输出。在XML世界中,给定文档可以以各种方式进行编码,这些方式在语义上是相同的,但就线路上的位而言是不同的(例如é&#233都表示相同的字符{{ 1}})。由你来定义你想要使用的平等概念;见canonical XML