长串通过其哈希值进行比较(Comparing long strings by their hashe

2019-07-29 08:11发布

试图改善这种比较字符串我决定通过比较它们的哈希值来比较它们的功能表现。 那么,有没有保证,如果2个很长串的哈希是彼此相等,则字符串也彼此相等?

Answer 1:

虽然它保证了2名相同的字符串将给你相同的哈希值,倒过来是不正确的:对于给定的哈希值,总有其产生相同的散列几个可能的字符串。 这是真实的,由于鸽巢原理 。

如此说来,产生的相同散列2个不同串的机率可制成极小,对被视为等同于空的点。

这种散列的一个相当典型例子是MD5 ,其具有近乎完美的128位的分布。 这意味着你有2 ^ 128一个机会,2个不同的字符串产生相同的哈希值。 好了,基本上,几乎一样不可能。



Answer 2:

在两个长字符串是简单常见的情况进行比较,以确定它们是否相同或不同,一个简单的比较将是更优选的超过一个哈希值,有两个原因。 首先,如@wildplasser指出,哈希需要两个字符串的所有字节必须以计算两个散列值进行遍历,而简单的比较快,只需要直到第一次发现差别时遍历字节,这可能比完整的字符串长度小得多。 和第二,一个简单的比较是保证检测到任何差异,而散列仅给出一个高概率它们是相同的,如通过@AdamLiss和@Cyan指出。

有,但是,其中散列比较可以用来很大的优势了一些有趣的案例。 正如@Cyan提到如果比较结果是要做一次以上,或必须储存以备后用,那么散列可能会更快。 不被别人提及的情况是,如果字符串是在通过本地网络或互联网连接的不同计算机。 通过两台机器之间的数据少量通常会快很多。 最简单的第一次检查是比较二者的大小,如果不同,就大功告成了。 否则,计算哈希值,它的每一个自己的机器上(假设你能够在远程计算机上创建的过程),并再次,如果不同就完成了。 如果散列值是相同的,如果你必须有绝对的把握,有没有简单的捷径是确定性。 两端使用无损压缩将允许更小的待传送数据以进行比较。 最后,如果这两个字符串通过时间分开,由@Cyan提到的,如果你想知道,如果从昨天起一个文件已经改变,并且已经从昨天的版本存储的散列,那么你可以今天的哈希值与它比较。

我希望这将有助于刺激一些“开箱即用”的想法的人。



Answer 3:

我不知道,如果你的表现会有所改善。 既:构建哈希+比较整数和简单地比较使用equals字符串具有相同的复杂性,在O(n)的规定,其中n是字符数。



文章来源: Comparing long strings by their hashes