仅具有一个输入哈希的Bloom过滤器仍然是Bloom过滤器吗?

时间:2018-11-26 00:59:41

标签: bloom-filter

如果我实现了仅使用一种哈希算法(例如杂音)的布隆过滤器,这是否仍被视为布隆过滤器?

例如,如果import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; public class SSCCE extends JPanel { private DefaultTableModel model; SSCCE() { setLayout( new BorderLayout() ); model = new DefaultTableModel(0, 2); JTable table = new JTable( model ); add(new JScrollPane( table )); JButton button = new JButton( "Add Row" ); add(button, BorderLayout.PAGE_END); button.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Vector<Object> row = new Vector<Object>(); row.add( "" + model.getRowCount() ); row.add( new Date().toString() ); model.addRow( row ); } }); } private static void createAndShowGUI() { JFrame frame = new JFrame("SSCCE"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new SSCCE()); frame.pack(); frame.setLocationByPlatform( true ); frame.setVisible( true ); } public static void main(String[] args) throws Exception { java.awt.EventQueue.invokeLater( () -> createAndShowGUI() ); /* EventQueue.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); */ } } 散列为a,则将设置过滤器的第5位。如果5散列为b,则将设置过滤器的位1,依此类推...

对于某种被视为布隆过滤器的东西,是否必须在过滤器中至少设置两位?如果只设置了一位,它还会被称为其他吗?

1 个答案:

答案 0 :(得分:0)

它仍然是布隆过滤器:带有k=1的过滤器。根据每个元素的位数,它可能不是最节省空间的。但是,出于各种原因,人们可能会选择不是k的{​​{1}},主要是:

  • 为了能够更好地进行压缩:最好使用带有round(bitsPerKey * log(2))的Bloom过滤器。另请参阅Michael Mitzenmacher的论文"Compressed Bloom Filters"
  • 要加快查找和更新速度,请使用较低的k=1

顺便说一句,即使您仅使用一个“应用程序散列函数”(例如具有64位的Murmur散列),仍然可以选择k来节省空间。您只需选择“ Bloom散列函数”作为此“应用程序散列函数”(64位Murmur散列)的函数,就像这样(假设k是32位,而int是64位) :

long

实际上,这比计算多个“应用程序散列函数”要容易得多。从外观上看,像这样:

long m = murmur(x)
h(x, i) = (int) (m >> 32) + i * (int) m 

许多Bloom过滤器库都这样做,例如Guava中的Bloom过滤器实现。