Hash Bloomfilter and Cassandra=为什么要使用,为什么要多次散列?

Hash Bloomfilter and Cassandra=为什么要使用,为什么要多次散列?,hash,cassandra,bloom-filter,Hash,Cassandra,Bloom Filter,我读到: 我的问题是: 1.)Cassandra只使用bloom过滤器查找最可能包含键的SST(排序字符串表)是否正确?因为可能有几个SST,卡桑德拉不知道钥匙可能在哪个SST中?因此,为了加快速度,所有SST中都使用了过滤器。这是正确的吗?(我试图了解卡桑德拉是如何工作的…) 2.)为什么(如上面链接中所述)对密钥进行多次散列?需要使用不同的散列函数对密钥进行多次散列以获得更好的位“随机分布”是正确的吗?如果这是错误的,为什么密钥需要散列多次?这会占用CPU周期吗?如果我有几个散列函数的输出

我读到:

我的问题是:

1.)Cassandra只使用bloom过滤器查找最可能包含键的SST(排序字符串表)是否正确?因为可能有几个SST,卡桑德拉不知道钥匙可能在哪个SST中?因此,为了加快速度,所有SST中都使用了过滤器。这是正确的吗?(我试图了解卡桑德拉是如何工作的…)

2.)为什么(如上面链接中所述)对密钥进行多次散列?需要使用不同的散列函数对密钥进行多次散列以获得更好的位“随机分布”是正确的吗?如果这是错误的,为什么密钥需要散列多次?这会占用CPU周期吗?如果我有几个散列函数的输出,那么对结果的处理是AND还是XORded。这有什么区别吗

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

非常感谢!! Jens是的,请看卡桑德拉的维基

Cassandra在执行密钥查找时使用bloom筛选器来保存IO:每个SSTable都有一个与之关联的bloom筛选器,Cassandra在进行任何磁盘查找之前都会对其进行检查,使得对不存在的密钥的查询几乎是免费的

这些数据可以分布在几个SSTable中。如果没有bloom过滤器,每次读取密钥都必须读取每个sstable,这是非常昂贵的。通过使用bloom过滤器,cassandra几乎总是只需查找包含该键数据的sstables表

2) 可能会让您更好地了解bloom过滤器。散列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]为false,所以您知道C不在集合中,但是,对于D

md5(D)  % m = 7
sha1(D)  % m = 15
m[7]和m[15]都为真,但D不在集合中,因此D为假阳性

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


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

作为sbridges回答的第三点的补充

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

建议使用非加密散列函数,如杂音散列,建议构造和散列函数,如下所示:

g(x) = h1(x) + i * h2(x) 
其中g(x)是新的散列函数,h1和h2是标准散列函数,i是从0到k的迭代次数

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

非常感谢!!!(我读了一篇关于bloomfilters的文章,文章以我的母语写成,文章似乎把一些步骤放在了一起,以便于解释。多亏了你的解释和链接,我现在真的理解了它是如何与位置一起工作的。非常感谢!