检查现有值时避免使用数据库

时间:2017-01-07 03:55:13

标签: database algorithm data-structures

在简单检查以前出现的字符串或值时,有没有办法通过哈希或按位运算符或其他算法来避免使用数据库? 假设,没有办法存储之前出现的字符串的整个历史记录,只能存储很少的信息。

1 个答案:

答案 0 :(得分:0)

您可能对Bloom过滤器感兴趣。他们不会让你权威地说,“是的,这个价值是在感兴趣的集合中”,但他们确实让你说“是的,这个价值可能在集合中”对比“否” ,这个值肯定是在集合中“。在许多情况下,这足以使用。

它的工作方式是:

  • 您创建一个布尔值数组(即位数)。制作这个数组越大越好。
  • 您创建了一堆不同的哈希函数,每个函数都接受一个输入字符串并将其映射到数组的一个元素。您希望这些散列函数是独立的,因此即使一个散列函数将两个字符串映射到同一个元素,不同的散列函数也很可能将它们映射到不同的元素。
  • 要记录字符串在集合中,您依次将每个散列函数应用于它 - 在数组中为您提供一组元素 - 并将所有映射到的元素设置为TRUE。
  • 要检查字符串是否(可能)在集合中,您执行相同的操作,但现在您只需检查映射到的元素以查看它们是否为TRUE。如果所有这些都为TRUE,那么字符串可能在集合中;否则,绝对不是。

如果您对此方法感兴趣,请参阅https://en.wikipedia.org/wiki/Bloom_filter以获取详细分析,以帮助您适当地调整过滤器(选择正确的数组大小和散列函数数量)以获得有用的概率。