Sha256: 45c768c0ad13b679fd15f0a3bc1a1457def0c918269513a61e47cf12f99176b8

Contents?: true

Size: 861 Bytes

Versions: 1

Compression:

Stored size: 861 Bytes

Contents

require_relative "bitarray"
require "json"

class JsonBloomfilter
  DEFAULTS = { "size" => 100, "hashes" => 4, "seed" => Time.new.to_i, "bits" => nil }

  def initialize options = {}
    @options = DEFAULTS.merge options
    @bits = BitArray.new(@options["size"], @options["bits"])
  end

  def add key
    indexes_for(key).each { |index| @bits[index] = 1 }
    nil
  end

  def test key
    indexes_for(key).each do |index|
      return false if @bits[index] == 0
    end
    true
  end

  def clear
    @bits = BitArray.new(@options["size"], 0)
  end

  def to_hash
    @options.merge({ "bits" => @bits.field })
  end

  def to_json
    JSON.generate to_hash
  end

  private

  def indexes_for key
    Array.new(@options["hashes"]).each_with_index.map do |item, index|
      Zlib.crc32("#{key}:#{index+@options["seed"]}") % @options["size"]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
json-bloomfilter-0.0.2 lib/json/bloomfilter.rb