如何解决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)达到相同的性能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。