Bloomfilter和Cassandra =为什么要使用,为什么要哈希几次?

问题描述

| 我读到这个: http://spyced.blogspot.com/2009/01/all-you-ever-wanted-to-kNow-about.html 我的问题: 1.)是正确的,Cassandra仅使用bloom过滤器来找出最有可能包含密钥的sst(排序的字符串表)吗?由于可能有多个sst,而Cassandra不知道密钥在哪个sst中?因此,为了加快查找速度,在所有sst中都使用了Bloomfilters。它是否正确? (我想了解cassandra的工作原理...) 2)为什么(如上面的链接中所述)密钥被散列了几次?为了获得更好的“位的随机分布”,需要用不同的哈希函数对密钥进行多次哈希是否正确?如果这是错误的,为什么一个键需要被散列几次?这会花费cpu周期吗?如果我有几个哈希函数输出,那么对结果进行“与”或“异或”处理。这有什么区别吗? 3.)使用MD5与SHA1(根据文章随机分布的)相比,“使用Bloomfilter的销售正数”的差异有多大?为什么MD5不是随机分布的? 非常感谢!! 詹斯     

解决方法

1)是的,请在cassandra Wiki中查看此内容,   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]为假,因此您知道C不在集合中
md5(D)  % m = 7
sha1(D)  % m = 15
m [7]和m [15]均为true,但D不在集合中,因此D为假阳性。 这确实会花费cpu周期,但是您要以降低io来交换cpu周期,这对cassandra有意义。 3)本文没有提到md5。 md5是随机分布的,我想对于Bloom过滤器,md5和sha-1之间的差异并不大。     ,作为对第三个答案的补充。 MD5和SHA-1是随机分布的,但它们是加密哈希函数。在实现任何类型的Bloom过滤器时,性能的唯一瓶颈是散列所花费的时间。这就是为什么使用加密功能会降低应用程序性能的原因。 建议使用非加密哈希函数,例如Murmur哈希。本文建议构造和散列函数,例如:
g(x) = h1(x) + i * h2(x) 
其中g(x)是新的哈希函数,h1和h2是标准哈希函数,而i是从0到k的迭代数。 通过使用此技术,可以通过两个哈希函数(假设k> 2)达到相同的性能。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...