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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?