json-bloomfilter 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +3 -2
- data/json-bloomfilter.gemspec +1 -1
- data/lib/json-bloomfilter.rb +68 -0
- data/lib/{json/bloomfilter → json-bloomfilter}/bitarray.rb +0 -0
- data/lib/json-bloomfilter/version.rb +3 -0
- data/lib/json/bloomfilter.rb +1 -68
- data/spec/spec_helper.rb +2 -2
- metadata +5 -4
- data/lib/json/bloomfilter/version.rb +0 -3
data/README.md
CHANGED
@@ -35,7 +35,7 @@ and the `json-bloomfilter.min.js` will be copied to your local directory. If you
|
|
35
35
|
### Ruby
|
36
36
|
|
37
37
|
```ruby
|
38
|
-
require "json
|
38
|
+
require "json-bloomfilter"
|
39
39
|
|
40
40
|
# use the factory to configure the filter
|
41
41
|
filter = JsonBloomFilter.build 10000, 0.01 # number of expected items, desired error rate
|
@@ -129,7 +129,8 @@ Additionally you can pass along:
|
|
129
129
|
|
130
130
|
## Release notes
|
131
131
|
|
132
|
-
* **0.1.
|
132
|
+
* **0.1.5** Changes namespacing
|
133
|
+
* **0.1.4** Changes .build function to take a list of items
|
133
134
|
* **0.1.3** Adds a check for non positive capacity values on build
|
134
135
|
* **0.1.2** Adds Zlib dependency
|
135
136
|
* **0.1.1** Fixes a JS integer overflow issue and makes Ruby 1.8.7 compatible
|
data/json-bloomfilter.gemspec
CHANGED
@@ -0,0 +1,68 @@
|
|
1
|
+
require "json-bloomfilter/bitarray"
|
2
|
+
require "json"
|
3
|
+
require "zlib"
|
4
|
+
|
5
|
+
class JsonBloomfilter
|
6
|
+
DEFAULTS = { "size" => 100, "hashes" => 4, "seed" => Time.new.to_i, "bits" => nil }
|
7
|
+
|
8
|
+
def self.build capacity_or_items, error_rate
|
9
|
+
capacity, items = capacity_or_items.is_a?(Array) ? [capacity_or_items.length, capacity_or_items] : [capacity_or_items, nil]
|
10
|
+
raise ArgumentError.new("Capacity needs to be a positive integer") if capacity <= 0
|
11
|
+
JsonBloomfilter.new :size => size_for(capacity, error_rate), :hashes => hashes_for(capacity, error_rate), :items => items
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.size_for capacity, error_rate
|
15
|
+
(capacity * Math.log(error_rate) / Math.log(1.0 / 2**Math.log(2))).ceil
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.hashes_for capacity, error_rate
|
19
|
+
(Math.log(2) * size_for(capacity, error_rate) / capacity).round
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize options = {}
|
23
|
+
items = options.delete("items")
|
24
|
+
@options = merge_defaults_with options
|
25
|
+
@bits = BitArray.new(@options["size"], @options["bits"])
|
26
|
+
add(items) if items
|
27
|
+
end
|
28
|
+
|
29
|
+
def add keys
|
30
|
+
[keys].flatten.each do |key|
|
31
|
+
indexes_for(key).each { |index| @bits.add(index) }
|
32
|
+
end
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def test keys
|
37
|
+
[keys].flatten.each do |key|
|
38
|
+
indexes_for(key).each do |index|
|
39
|
+
return false if @bits.get(index) == 0
|
40
|
+
end
|
41
|
+
end
|
42
|
+
true
|
43
|
+
end
|
44
|
+
|
45
|
+
def clear
|
46
|
+
@bits = BitArray.new(@options["size"])
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_hash
|
50
|
+
@options.merge({ "bits" => @bits.field })
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_json
|
54
|
+
JSON.generate to_hash
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def indexes_for key
|
60
|
+
Array.new(@options["hashes"]).each_with_index.map do |item, index|
|
61
|
+
Zlib.crc32("#{key}:#{index+@options["seed"]}") % @options["size"]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def merge_defaults_with options
|
66
|
+
DEFAULTS.merge Hash[options.map {|k, v| ["#{k}", v] }]
|
67
|
+
end
|
68
|
+
end
|
File without changes
|
data/lib/json/bloomfilter.rb
CHANGED
@@ -1,68 +1 @@
|
|
1
|
-
require "json
|
2
|
-
require "json"
|
3
|
-
require "zlib"
|
4
|
-
|
5
|
-
class JsonBloomfilter
|
6
|
-
DEFAULTS = { "size" => 100, "hashes" => 4, "seed" => Time.new.to_i, "bits" => nil }
|
7
|
-
|
8
|
-
def self.build capacity_or_items, error_rate
|
9
|
-
capacity, items = capacity_or_items.is_a?(Array) ? [capacity_or_items.length, capacity_or_items] : [capacity_or_items, nil]
|
10
|
-
raise ArgumentError.new("Capacity needs to be a positive integer") if capacity <= 0
|
11
|
-
JsonBloomfilter.new :size => size_for(capacity, error_rate), :hashes => hashes_for(capacity, error_rate), items: items
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.size_for capacity, error_rate
|
15
|
-
(capacity * Math.log(error_rate) / Math.log(1.0 / 2**Math.log(2))).ceil
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.hashes_for capacity, error_rate
|
19
|
-
(Math.log(2) * size_for(capacity, error_rate) / capacity).round
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize options = {}
|
23
|
-
items = options.delete("items")
|
24
|
-
@options = merge_defaults_with options
|
25
|
-
@bits = BitArray.new(@options["size"], @options["bits"])
|
26
|
-
add(items) if items
|
27
|
-
end
|
28
|
-
|
29
|
-
def add keys
|
30
|
-
[keys].flatten.each do |key|
|
31
|
-
indexes_for(key).each { |index| @bits.add(index) }
|
32
|
-
end
|
33
|
-
nil
|
34
|
-
end
|
35
|
-
|
36
|
-
def test keys
|
37
|
-
[keys].flatten.each do |key|
|
38
|
-
indexes_for(key).each do |index|
|
39
|
-
return false if @bits.get(index) == 0
|
40
|
-
end
|
41
|
-
end
|
42
|
-
true
|
43
|
-
end
|
44
|
-
|
45
|
-
def clear
|
46
|
-
@bits = BitArray.new(@options["size"])
|
47
|
-
end
|
48
|
-
|
49
|
-
def to_hash
|
50
|
-
@options.merge({ "bits" => @bits.field })
|
51
|
-
end
|
52
|
-
|
53
|
-
def to_json
|
54
|
-
JSON.generate to_hash
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def indexes_for key
|
60
|
-
Array.new(@options["hashes"]).each_with_index.map do |item, index|
|
61
|
-
Zlib.crc32("#{key}:#{index+@options["seed"]}") % @options["size"]
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def merge_defaults_with options
|
66
|
-
DEFAULTS.merge Hash[options.map {|k, v| ["#{k}", v] }]
|
67
|
-
end
|
68
|
-
end
|
1
|
+
require "json-bloomfilter"
|
data/spec/spec_helper.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require "json
|
2
|
-
require "json
|
1
|
+
require "json-bloomfilter"
|
2
|
+
require "json-bloomfilter/bitarray"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-bloomfilter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -179,9 +179,10 @@ files:
|
|
179
179
|
- coffee/zlib.coffee
|
180
180
|
- js/json-bloomfilter.min.js
|
181
181
|
- json-bloomfilter.gemspec
|
182
|
+
- lib/json-bloomfilter.rb
|
183
|
+
- lib/json-bloomfilter/bitarray.rb
|
184
|
+
- lib/json-bloomfilter/version.rb
|
182
185
|
- lib/json/bloomfilter.rb
|
183
|
-
- lib/json/bloomfilter/bitarray.rb
|
184
|
-
- lib/json/bloomfilter/version.rb
|
185
186
|
- spec/javascripts/bitarray_spec.js
|
186
187
|
- spec/javascripts/bloomfilter_spec.js
|
187
188
|
- spec/javascripts/support/jasmine.yml
|
@@ -210,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
211
|
version: '0'
|
211
212
|
segments:
|
212
213
|
- 0
|
213
|
-
hash:
|
214
|
+
hash: -423997557885043161
|
214
215
|
requirements: []
|
215
216
|
rubyforge_project:
|
216
217
|
rubygems_version: 1.8.24
|