【问题标题】:Bloomfilter and Cassandra = Why used and why hashed several times?Bloomfilter 和 Cassandra = 为什么使用以及为什么要多次散列?
【发布时间】:2011-08-16 11:55:51
【问题描述】:

我读到这个: http://spyced.blogspot.com/2009/01/all-you-ever-wanted-to-know-about.html

我的问题:

1.) Cassandra 仅使用布隆过滤器来找出最有可能包含密钥的 SST(排序字符串表)是否正确?因为可能有几个 SST,而 Cassandra 不知道密钥可能在哪个 SST 中?因此,为了加快查看所有 SST,使用了bloomfilters。它是否正确? (我正在尝试了解 cassandra 的工作原理......)

2.) 为什么(如上面的链接中所解释的)密钥会被多次散列?需要使用不同的哈希函数对密钥进行多次哈希处理以获得更好的“随机分布”位,这是否正确?如果这是错误的,为什么需要对密钥进行多次散列?这会消耗 CPU 周期吗?如果我有几个 Hash 函数的输出,那么对结果做了什么,它们是 ANDed 还是 XORded。这有什么不同吗?

3.)使用 MD5 与 SHA1(根据文章是随机分布的)相比,“使用 Bloomfilter 的 Fales 正数”的差异有多大?为什么MD5不是随机分布的?

非常感谢!! 延斯

【问题讨论】:

    标签: hash cassandra bloom-filter


    【解决方案1】:

    作为对 sbridges 答案第三点的补充。

    MD5 和 SHA-1 是随机分布的,但属于加密哈希函数。在实现任何类型的布隆过滤器时,性能的唯一瓶颈是散列所花费的时间。这就是为什么使用加密函数会降低应用程序的性能。

    建议使用像 Murmur 哈希这样的非加密哈希函数。 This paper,建议构造和散列函数如:

    g(x) = h1(x) + i * h2(x) 
    

    其中 g(x) 是新的哈希函数,h1 和 h2 是标准哈希函数,i 是迭代次数,范围从 0 到 k。

    通过使用这种技术,两个散列函数可以达到相同的性能(假设 k > 2)。

    【讨论】:

      【解决方案2】:

      1) 是的,请参阅 cassandra wiki 中的 this

      Cassandra 在执行键查找时使用布隆过滤器来节省 IO:每个 SSTable 都有一个与之关联的布隆过滤器,Cassandra 在进行任何磁盘查找之前都会对其进行检查,从而几乎可以免费查询不存在的键

      columns of a key 可能分布在多个 sstable 中。如果不是布隆过滤器,每次读取密钥都必须读取每个 sstable,这非常昂贵。通过使用布隆过滤器,cassandra 几乎总是只需要查看包含该键数据的 sstables。

      2) This 可能会让您更好地了解布隆过滤器。您散列 k 次以在大小为 m 的数组中给出独立的位置。例如,如果 A 和 B 是集合中的元素,并且你有 k = 2,你的哈希函数是 md5 和 sha1,并且 m = 16,你可以这样做

      md5(A) % m = 7
      sha1(A) % m = 12
      
      md5(B)  % m = 15
      sha1(B)  % m = 12
      

      这给你 m[7]、m[12] 和 m[15] 对于过滤器是真的。

      要查看 C 是否在集合中,您可以这样做

      md5(C)  % m = 8
      sha1(C) % m = 12
      

      由于 m[8] 为假,你知道 C 不在集合中,然而,对于 D

      md5(D)  % m = 7
      sha1(D)  % m = 15
      

      m[7] 和 m[15] 都为真,但 D 不在集合中,所以 D 是假阳性。

      这确实会消耗 cpu 周期,但是您正在用 cpu 周期来换取减少的 io,这对 cassandra 来说是有意义的。

      3) 文章没有提到 md5。 md5 是随机分布的,我猜布隆过滤器的 md5 和 sha-1 之间的差异并不大。

      【讨论】:

      • 非常感谢!!! (我用我的母语阅读了一篇关于bloomfilters的文章,似乎将一些步骤放在一起以便于解释,现在我真的明白了它是如何与职位一起工作的,感谢你的解释和链接。非常感谢!
      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 2012-04-26
      • 2011-10-22
      • 2020-10-25
      • 1970-01-01
      • 2019-03-23
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多