使用哈希检查字符串匹配,而不检查整个字符串

时间:2010-11-08 18:57:38

标签: hash string-hashing

我正在尝试检查两个字符串是否尽快相同。如果不比较整个字符串,我可以保护自己免受哈希冲突吗?

我有一个由字符串键入的项目缓存。我存储字符串的哈希值,字符串的长度和字符串本身。 (我目前正在使用djb2生成哈希值。)

要检查输入字符串是否与缓存中的项匹配,我计算输入的哈希值,并将其与存储的哈希值进行比较。如果匹配,我将输入的长度(我得到的计算哈希的副作用)与存储的长度进行比较。最后,如果匹配,我会对输入和存储的字符串进行完整的字符串比较。

是否有必要进行完整的字符串比较?例如,是否存在字符串哈希算法,可以在数学上保证没有两个相同长度的 将生成相同的哈希?如果没有,如果前N个字符中的任何一个字符不同,算法是否可以保证相同长度的两个不同字符串会生成不同的哈希码?

基本上,任何字符串比较方案在字符串不同时提供O(1)性能但在匹配时优于O(n)性能将比我现在正在做的改进。

2 个答案:

答案 0 :(得分:0)

如果使用现代散列函数(例如Secure Hash Algorithm (SHA)变体之一),则应该避免碰撞。

答案 1 :(得分:0)

  

例如,是否有一个字符串哈希算法可以在数学上保证没有两个相同长度的字符串会生成相同的哈希值?

不,而且不可能。想一想:哈希的长度有限,但字符串没有。为了论证而说,哈希值是32位。你能创造超过20亿个具有相同长度的独特字符串吗?当然你可以 - 你可以创建无限数量的唯一字符串,因此比较哈希值不足以保证唯一性。这个论点可以扩展到更长的哈希值。

  

如果没有,如果前N个字符中的任何一个字符不同,算法是否可以保证两个相同长度的不同字符串会生成不同的哈希码?

嗯,是的,只要散列中的位数与字符串中的位数一样大,但这可能不是你要找的答案。

用于循环冗余校验的一些算法具有保证,如果恰好有一位不同,则保证CRC在某个特定的运行长度上不同,但这仅适用于相对较短的运行。