Advertisement
Guest User

Untitled

a guest
Oct 21st, 2014
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. # n = Number of items in the filter
  2. # p = Probability of false positives, float between 0 and 1 or a number indicating 1-in-p
  3. # m = Number of bits in the filter
  4. # k = Number of hash functions
  5.  
  6. require_relative '../bitarray/bit_array'
  7. require 'digest'
  8.  
  9. class BloomFilter
  10.  
  11. def initialize k: 1, m: 10
  12. @k = k
  13. @m = m
  14. @n = 0
  15. @b = BitArray.new
  16. end
  17.  
  18. # Probability of a false positive based on formula in wikipedia
  19. def false_positive_rate
  20. fp_rate = (1-(1-1/@m.to_f)**(@k.to_f*@n.to_f))**@k.to_f
  21. p fp_rate
  22. fp_rate.round(2)
  23. end
  24.  
  25. def insert item
  26. @n += 1
  27. @k.times do |n|
  28. hash_val = Digest::MD5.hexdigest( item.to_s + n.to_s ).to_i(16)
  29. position = hash_val % @m
  30. @b.set position
  31. end
  32. self
  33. end
  34.  
  35. def include? item
  36. @k.times do |n|
  37. hash_val = Digest::MD5.hexdigest( item.to_s + n.to_s ).to_i(16)
  38. position = hash_val % @m
  39. return @b.get(position) == 1
  40. end
  41. return false
  42. end
  43.  
  44. end
  45.  
  46. require 'minitest/autorun'
  47. require_relative 'bloom_filter'
  48.  
  49. class BloomFilterTest < MiniTest::Unit::TestCase
  50.  
  51. # Verified probability formula and tests from http://hur.st/bloomfilter?n=1&p=0.01
  52. def test_stats
  53. assert_equal 0.01, BloomFilter.new(k: 7, m: 10).insert("a").false_positive_rate
  54. b = BloomFilter.new(k: 2, m: 29)
  55. 10.times { |n| b.insert(n) }
  56. assert_equal 0.25, b.false_positive_rate
  57. end
  58.  
  59. def test_include
  60. b = BloomFilter.new(k: 2, m: 100)
  61. b.insert "The Trumpet of the Swan"
  62. assert_equal true, b.include?("The Trumpet of the Swan")
  63. refute b.include?("E. B. White")
  64. end
  65.  
  66. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement