bloombroom 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile +4 -0
- data/README.md +75 -45
- data/Rakefile +23 -0
- data/benchmark/bloom_filter.rb +35 -0
- data/benchmark/bloom_filter_memory.rb +28 -0
- data/benchmark/continuous_bloom_filter.rb +60 -0
- data/benchmark/continuous_bloom_filter_memory.rb +28 -0
- data/benchmark/continuous_bloom_filter_stats.rb +63 -0
- data/benchmark/memory.rb +8 -0
- data/bloombroom.gemspec +28 -0
- data/ffi/bloombroom/hash/Rakefile +5 -0
- data/{ext/bloombroom/hash/ffi → ffi/bloombroom/hash}/ffi_fnv.c +0 -0
- data/lib/bloombroom.rb +10 -6
- data/lib/bloombroom/hash/ffi_fnv.rb +4 -8
- data/lib/bloombroom/version.rb +1 -1
- data/spec/bloombroom/bits/bit_bucket_field_spec.rb +142 -0
- data/spec/bloombroom/bits/bit_field_spec.rb +108 -0
- data/spec/bloombroom/filter/bloom_filter_spec.rb +43 -0
- data/spec/bloombroom/filter/bloom_helper_spec.rb +18 -0
- data/spec/bloombroom/filter/continuous_bloom_filter_spec.rb +107 -0
- data/spec/bloombroom/hash/ffi_fnv_spec.rb +31 -0
- data/spec/bloombroom/hash/test_vectors.rb +610 -0
- data/spec/spec_helper.rb +2 -0
- metadata +94 -49
- data/ext/bloombroom/hash/cext/cext_fnv.c +0 -91
- data/ext/bloombroom/hash/cext/extconf.rb +0 -3
- data/ext/bloombroom/hash/ffi/extconf.rb +0 -3
- data/lib/bloombroom/hash/fnv_a.rb +0 -100
- data/lib/bloombroom/hash/fnv_b.rb +0 -56
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,100 +1,145 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bloombroom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
prerelease:
|
5
|
+
version: 1.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Colin Surprenant
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
|
15
|
+
name: ffi
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.0.0
|
17
21
|
none: false
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
18
23
|
requirements:
|
19
|
-
- -
|
24
|
+
- - ">="
|
20
25
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
22
|
-
|
26
|
+
version: 1.0.0
|
27
|
+
none: false
|
23
28
|
prerelease: false
|
29
|
+
type: :runtime
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: ffi-compiler
|
24
32
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
33
|
requirements:
|
27
|
-
- -
|
34
|
+
- - ">="
|
28
35
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
|
31
|
-
name: ffi
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
+
version: !binary |-
|
37
|
+
MA==
|
33
38
|
none: false
|
39
|
+
requirement: !ruby/object:Gem::Requirement
|
34
40
|
requirements:
|
35
|
-
- -
|
41
|
+
- - ">="
|
36
42
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
38
|
-
|
43
|
+
version: !binary |-
|
44
|
+
MA==
|
45
|
+
none: false
|
39
46
|
prerelease: false
|
47
|
+
type: :runtime
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.8.0
|
41
55
|
none: false
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
42
57
|
requirements:
|
43
|
-
- -
|
58
|
+
- - ">="
|
44
59
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
60
|
+
version: 2.8.0
|
61
|
+
none: false
|
62
|
+
prerelease: false
|
63
|
+
type: :development
|
64
|
+
description: bloombroom has two bloom filter implementations, a standard filter for bounded key space and a continuous filter for unbounded keys (stream). also contains fast C/FFI FNV hashing and fast bit field and bit bucket field (multi bits).
|
50
65
|
email:
|
51
66
|
- colin.surprenant@gmail.com
|
52
67
|
executables: []
|
53
68
|
extensions:
|
54
|
-
-
|
55
|
-
- ext/bloombroom/hash/ffi/extconf.rb
|
69
|
+
- ffi/bloombroom/hash/Rakefile
|
56
70
|
extra_rdoc_files: []
|
57
71
|
files:
|
72
|
+
- ".gitignore"
|
73
|
+
- ".travis.yml"
|
74
|
+
- CHANGELOG.md
|
75
|
+
- Gemfile
|
76
|
+
- LICENSE.md
|
77
|
+
- README.md
|
78
|
+
- Rakefile
|
79
|
+
- benchmark/bloom_filter.rb
|
80
|
+
- benchmark/bloom_filter_memory.rb
|
81
|
+
- benchmark/continuous_bloom_filter.rb
|
82
|
+
- benchmark/continuous_bloom_filter_memory.rb
|
83
|
+
- benchmark/continuous_bloom_filter_stats.rb
|
84
|
+
- benchmark/memory.rb
|
85
|
+
- bloombroom.gemspec
|
86
|
+
- ffi/bloombroom/hash/Rakefile
|
87
|
+
- ffi/bloombroom/hash/ffi_fnv.c
|
88
|
+
- lib/bloombroom.rb
|
58
89
|
- lib/bloombroom/bits/bit_bucket_field.rb
|
59
90
|
- lib/bloombroom/bits/bit_field.rb
|
60
91
|
- lib/bloombroom/filter/bloom_filter.rb
|
61
92
|
- lib/bloombroom/filter/bloom_helper.rb
|
62
93
|
- lib/bloombroom/filter/continuous_bloom_filter.rb
|
63
94
|
- lib/bloombroom/hash/ffi_fnv.rb
|
64
|
-
- lib/bloombroom/hash/fnv_a.rb
|
65
|
-
- lib/bloombroom/hash/fnv_b.rb
|
66
95
|
- lib/bloombroom/version.rb
|
67
|
-
-
|
68
|
-
-
|
69
|
-
-
|
70
|
-
-
|
71
|
-
-
|
72
|
-
-
|
73
|
-
-
|
74
|
-
-
|
96
|
+
- spec/bloombroom/bits/bit_bucket_field_spec.rb
|
97
|
+
- spec/bloombroom/bits/bit_field_spec.rb
|
98
|
+
- spec/bloombroom/filter/bloom_filter_spec.rb
|
99
|
+
- spec/bloombroom/filter/bloom_helper_spec.rb
|
100
|
+
- spec/bloombroom/filter/continuous_bloom_filter_spec.rb
|
101
|
+
- spec/bloombroom/hash/ffi_fnv_spec.rb
|
102
|
+
- spec/bloombroom/hash/test_vectors.rb
|
103
|
+
- spec/spec_helper.rb
|
75
104
|
homepage: https://github.com/colinsurprenant/bloombroom
|
76
|
-
licenses:
|
77
|
-
|
105
|
+
licenses:
|
106
|
+
- Apache 2.0
|
107
|
+
post_install_message:
|
78
108
|
rdoc_options: []
|
79
109
|
require_paths:
|
80
110
|
- lib
|
81
111
|
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
112
|
requirements:
|
84
|
-
- -
|
113
|
+
- - ">="
|
85
114
|
- !ruby/object:Gem::Version
|
86
|
-
version:
|
87
|
-
|
115
|
+
version: !binary |-
|
116
|
+
MA==
|
117
|
+
segments:
|
118
|
+
- 0
|
119
|
+
hash: 2
|
88
120
|
none: false
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
122
|
requirements:
|
90
|
-
- -
|
123
|
+
- - ">="
|
91
124
|
- !ruby/object:Gem::Version
|
92
|
-
version:
|
125
|
+
version: !binary |-
|
126
|
+
MA==
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
hash: 2
|
130
|
+
none: false
|
93
131
|
requirements: []
|
94
|
-
rubyforge_project:
|
132
|
+
rubyforge_project:
|
95
133
|
rubygems_version: 1.8.24
|
96
|
-
signing_key:
|
134
|
+
signing_key:
|
97
135
|
specification_version: 3
|
98
|
-
summary: bloom filters for bounded and unbounded (streaming) data, FNV hashing and
|
99
|
-
|
100
|
-
|
136
|
+
summary: bloom filters for bounded and unbounded (streaming) data, fast C/FFI FNV hashing and bit fields
|
137
|
+
test_files:
|
138
|
+
- spec/bloombroom/bits/bit_bucket_field_spec.rb
|
139
|
+
- spec/bloombroom/bits/bit_field_spec.rb
|
140
|
+
- spec/bloombroom/filter/bloom_filter_spec.rb
|
141
|
+
- spec/bloombroom/filter/bloom_helper_spec.rb
|
142
|
+
- spec/bloombroom/filter/continuous_bloom_filter_spec.rb
|
143
|
+
- spec/bloombroom/hash/ffi_fnv_spec.rb
|
144
|
+
- spec/bloombroom/hash/test_vectors.rb
|
145
|
+
- spec/spec_helper.rb
|
@@ -1,91 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* based on https://github.com/robey/rbfnv with various fixes from forks
|
3
|
-
*/
|
4
|
-
|
5
|
-
#include <stdint.h>
|
6
|
-
#include "ruby.h"
|
7
|
-
|
8
|
-
#define PRIME32 16777619
|
9
|
-
#define PRIME64 1099511628211ULL
|
10
|
-
|
11
|
-
/**
|
12
|
-
* FNV fast hashing algorithm in 32 bits.
|
13
|
-
* @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
|
14
|
-
*/
|
15
|
-
uint32_t fnv1_32(const char *data, uint64_t len) {
|
16
|
-
uint32_t rv = 0x811c9dc5U;
|
17
|
-
uint64_t i;
|
18
|
-
for (i = 0; i < len; i++) {
|
19
|
-
rv = (rv * PRIME32) ^ (unsigned char)(data[i]);
|
20
|
-
}
|
21
|
-
return rv;
|
22
|
-
}
|
23
|
-
|
24
|
-
/**
|
25
|
-
* FNV fast hashing algorithm in 32 bits, variant with operations reversed.
|
26
|
-
* @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
|
27
|
-
*/
|
28
|
-
uint32_t fnv1a_32(const char *data, uint64_t len) {
|
29
|
-
uint32_t rv = 0x811c9dc5U;
|
30
|
-
uint64_t i;
|
31
|
-
for (i = 0; i < len; i++) {
|
32
|
-
rv = (rv ^ (unsigned char)data[i]) * PRIME32;
|
33
|
-
}
|
34
|
-
return rv;
|
35
|
-
}
|
36
|
-
|
37
|
-
/**
|
38
|
-
* FNV fast hashing algorithm in 64 bits.
|
39
|
-
* @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
|
40
|
-
*/
|
41
|
-
uint64_t fnv1_64(const char *data, uint64_t len) {
|
42
|
-
uint64_t rv = 0xcbf29ce484222325ULL;
|
43
|
-
uint64_t i;
|
44
|
-
for (i = 0; i < len; i++) {
|
45
|
-
rv = (rv * PRIME64) ^ (unsigned char)data[i];
|
46
|
-
}
|
47
|
-
return rv;
|
48
|
-
}
|
49
|
-
|
50
|
-
/**
|
51
|
-
* FNV fast hashing algorithm in 64 bits, variant with operations reversed.
|
52
|
-
* @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
|
53
|
-
*/
|
54
|
-
uint64_t fnv1a_64(const char *data, uint64_t len) {
|
55
|
-
uint64_t rv = 0xcbf29ce484222325ULL;
|
56
|
-
uint64_t i;
|
57
|
-
for (i = 0; i < len; i++) {
|
58
|
-
rv = (rv ^ (unsigned char)data[i]) * PRIME64;
|
59
|
-
}
|
60
|
-
return rv;
|
61
|
-
}
|
62
|
-
|
63
|
-
/* ----- ruby bindings ----- */
|
64
|
-
|
65
|
-
VALUE rb_fnv1_32(VALUE self, VALUE data) {
|
66
|
-
return UINT2NUM(fnv1_32(RSTRING_PTR(data), RSTRING_LEN(data)));
|
67
|
-
}
|
68
|
-
|
69
|
-
VALUE rb_fnv1a_32(VALUE self, VALUE data) {
|
70
|
-
return UINT2NUM(fnv1a_32(RSTRING_PTR(data), RSTRING_LEN(data)));
|
71
|
-
}
|
72
|
-
|
73
|
-
VALUE rb_fnv1_64(VALUE self, VALUE data) {
|
74
|
-
return ULL2NUM(fnv1_64(RSTRING_PTR(data), RSTRING_LEN(data)));
|
75
|
-
}
|
76
|
-
|
77
|
-
VALUE rb_fnv1a_64(VALUE self, VALUE data) {
|
78
|
-
return ULL2NUM(fnv1a_64(RSTRING_PTR(data), RSTRING_LEN(data)));
|
79
|
-
}
|
80
|
-
|
81
|
-
VALUE rb_class;
|
82
|
-
VALUE rb_module;
|
83
|
-
|
84
|
-
void Init_cext_fnv() {
|
85
|
-
rb_module = rb_define_module("Bloombroom");
|
86
|
-
rb_class = rb_define_class_under(rb_module, "FNVEXT", rb_cObject);
|
87
|
-
rb_define_singleton_method(rb_class, "fnv1_32", rb_fnv1_32, 1);
|
88
|
-
rb_define_singleton_method(rb_class, "fnv1a_32", rb_fnv1a_32, 1);
|
89
|
-
rb_define_singleton_method(rb_class, "fnv1_64", rb_fnv1_64, 1);
|
90
|
-
rb_define_singleton_method(rb_class, "fnv1a_64", rb_fnv1a_64, 1);
|
91
|
-
}
|
@@ -1,100 +0,0 @@
|
|
1
|
-
# based on https://github.com/andyjeffries/digestfnv
|
2
|
-
|
3
|
-
module Bloombroom
|
4
|
-
class FNVA
|
5
|
-
|
6
|
-
OFFSET32 = 2166136261
|
7
|
-
OFFSET64 = 14695981039346656037
|
8
|
-
OFFSET128 = 144066263297769815596495629667062367629
|
9
|
-
OFFSET256 = 100029257958052580907070968620625704837092796014241193945225284501741471925557
|
10
|
-
OFFSET512 = 9659303129496669498009435400716310466090418745672637896108374329434462657994582932197716438449813051892206539805784495328239340083876191928701583869517785
|
11
|
-
OFFSET1024 = 14197795064947621068722070641403218320880622795441933960878474914617582723252296732303717722150864096521202355549365628174669108571814760471015076148029755969804077320157692458563003215304957150157403644460363550505412711285966361610267868082893823963790439336411086884584107735010676915
|
12
|
-
|
13
|
-
PRIME32 = 16777619
|
14
|
-
PRIME64 = 1099511628211
|
15
|
-
PRIME128 = 309485009821345068724781371
|
16
|
-
PRIME256 = 374144419156711147060143317175368453031918731002211
|
17
|
-
PRIME512 = 35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852759
|
18
|
-
PRIME1024 = 5016456510113118655434598811035278955030765345404790744303017523831112055108147451509157692220295382716162651878526895249385292291816524375083746691371804094271873160484737966720260389217684476157468082573
|
19
|
-
|
20
|
-
MASK32 = (2 ** 32) - 1
|
21
|
-
MASK64 = (2 ** 64) - 1
|
22
|
-
MASK128 = (2 ** 128) - 1
|
23
|
-
MASK256 = (2 ** 256) - 1
|
24
|
-
MASK512 = (2 ** 512) - 1
|
25
|
-
MASK1024 = (2 ** 1024) - 1
|
26
|
-
|
27
|
-
def self.fnv1_32(input)
|
28
|
-
hash = OFFSET32
|
29
|
-
input.each_byte { |b| hash = (hash * PRIME32) ^ b }
|
30
|
-
hash & MASK32
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.fnv1_64(input)
|
34
|
-
hash = OFFSET64
|
35
|
-
input.each_byte { |b| hash = (hash * PRIME64) ^ b }
|
36
|
-
hash & MASK64
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.fnv1_128(input)
|
40
|
-
hash = OFFSET128
|
41
|
-
input.each_byte { |b| hash = (hash * PRIME128) ^ b }
|
42
|
-
hash & MASK128
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.fnv1_256(input)
|
46
|
-
hash = OFFSET256
|
47
|
-
input.each_byte { |b| hash = (hash * PRIME256) ^ b }
|
48
|
-
hash & MASK256
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.fnv1_512(input)
|
52
|
-
hash = OFFSET512
|
53
|
-
input.each_byte { |b| hash = (hash * PRIME512) ^ b }
|
54
|
-
hash & MASK512
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.fnv1_1024(input)
|
58
|
-
hash = OFFSET1024
|
59
|
-
input.each_byte { |b| hash = (hash * PRIME1024) ^ b }
|
60
|
-
hash & MASK1024
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.fnv1a_32(input)
|
64
|
-
hash = OFFSET32
|
65
|
-
input.each_byte { |b| hash = (hash ^ b) * PRIME32 }
|
66
|
-
hash & MASK32
|
67
|
-
end
|
68
|
-
|
69
|
-
def self.fnv1a_64(input)
|
70
|
-
hash = OFFSET64
|
71
|
-
input.each_byte { |b| hash = (hash ^ b) * PRIME64 }
|
72
|
-
hash & MASK64
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.fnv1a_128(input)
|
76
|
-
hash = OFFSET128
|
77
|
-
input.each_byte { |b| hash = (hash ^ b) * PRIME128 }
|
78
|
-
hash & MASK128
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.fnv1a_256(input)
|
82
|
-
hash = OFFSET256
|
83
|
-
input.each_byte { |b| hash = (hash ^ b) * PRIME256 }
|
84
|
-
hash & MASK256
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.fnv1a_512(input)
|
88
|
-
hash = OFFSET512
|
89
|
-
input.each_byte { |b| hash = (hash ^ b) * PRIME512 }
|
90
|
-
hash & MASK512
|
91
|
-
end
|
92
|
-
|
93
|
-
def self.fnv1a_1024(input)
|
94
|
-
hash = OFFSET1024
|
95
|
-
input.each_byte { |b| hash = (hash ^ b) * PRIME1024 }
|
96
|
-
hash & MASK1024
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# based on https://github.com/jakedouglas/fnv-ruby
|
2
|
-
|
3
|
-
module Bloombroom
|
4
|
-
class FNVB
|
5
|
-
INIT32 = 0x811c9dc5
|
6
|
-
INIT64 = 0xcbf29ce484222325
|
7
|
-
PRIME32 = 0x01000193
|
8
|
-
PRIME64 = 0x100000001b3
|
9
|
-
MOD32 = 2 ** 32
|
10
|
-
MOD64 = 2 ** 64
|
11
|
-
|
12
|
-
def self.fnv1_32(data)
|
13
|
-
hash = INIT32
|
14
|
-
|
15
|
-
data.each_byte do |byte|
|
16
|
-
hash = (hash * PRIME32) % MOD32
|
17
|
-
hash = hash ^ byte
|
18
|
-
end
|
19
|
-
|
20
|
-
hash
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.fnv1_64(data)
|
24
|
-
hash = INIT64
|
25
|
-
|
26
|
-
data.each_byte do |byte|
|
27
|
-
hash = (hash * PRIME64) % MOD64
|
28
|
-
hash = hash ^ byte
|
29
|
-
end
|
30
|
-
|
31
|
-
hash
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.fnv1a_32(data)
|
35
|
-
hash = INIT32
|
36
|
-
|
37
|
-
data.each_byte do |byte|
|
38
|
-
hash = hash ^ byte
|
39
|
-
hash = (hash * PRIME32) % MOD32
|
40
|
-
end
|
41
|
-
|
42
|
-
hash
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.fnv1a_64(data)
|
46
|
-
hash = INIT64
|
47
|
-
|
48
|
-
data.each_byte do |byte|
|
49
|
-
hash = hash ^ byte
|
50
|
-
hash = (hash * PRIME64) % MOD64
|
51
|
-
end
|
52
|
-
|
53
|
-
hash
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|