代码之家  ›  专栏  ›  技术社区  ›  LightStruk

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

  •  1
  • LightStruk  · 技术社区  · 14 年前

    我正在试着尽快检查两个字符串是否相同。我可以在不比较整个字符串的情况下保护自己不受哈希冲突的影响吗?

    我有一个由字符串键控的项目的缓存。我存储字符串的散列值、字符串的长度和字符串本身。(我正在使用 djb2 生成散列。)

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

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

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

    2 回复  |  直到 14 年前
        1
  •  0
  •   500 - Internal Server Error    14 年前

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

    不,不可能。考虑一下:哈希的长度是有限的,但字符串的长度是有限的。为了论证的缘故,说散列是32位。你能用同样的长度创建20多亿个唯一的字符串吗?当然可以-您可以创建无限多的唯一字符串,因此比较哈希值不足以保证唯一性。这个参数扩展到更长的散列值。

    如果不是,如果前n个字符中的任何一个不同,算法能否保证相同长度的两个不同字符串将生成不同的哈希代码?

    是的,只要散列中的位数和字符串中的位数一样大,但这可能不是您想要的答案。

    用于循环冗余检查的一些算法具有保证,例如,如果恰好有一个位不同,那么在一定的位运行长度上,CRC保证是不同的,但这只适用于相对较短的运行时间。

        2
  •  0
  •   Justin Ethier    14 年前

    如果使用现代散列函数(如 Secure Hash Algorithm (SHA) 变体。