Hash Bloomfilter and Cassandra=为什么要使用,为什么要多次散列?
我读到: 我的问题是: 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,则可以执行以下操作:Hash Bloomfilter and Cassandra=为什么要使用,为什么要多次散列?,hash,cassandra,bloom-filter,Hash,Cassandra,Bloom Filter,我读到: 我的问题是: 1.)Cassandra只使用bloom过滤器查找最可能包含键的SST(排序字符串表)是否正确?因为可能有几个SST,卡桑德拉不知道钥匙可能在哪个SST中?因此,为了加快速度,所有SST中都使用了过滤器。这是正确的吗?(我试图了解卡桑德拉是如何工作的…) 2.)为什么(如上面链接中所述)对密钥进行多次散列?需要使用不同的散列函数对密钥进行多次散列以获得更好的位“随机分布”是正确的吗?如果这是错误的,为什么密钥需要散列多次?这会占用CPU周期吗?如果我有几个散列函数的输出
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的文章,文章以我的母语写成,文章似乎把一些步骤放在了一起,以便于解释。多亏了你的解释和链接,我现在真的理解了它是如何与位置一起工作的。非常感谢!