fast_hash_ring 0.1 → 0.1.1
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/Rakefile +2 -2
- data/benchmarks/fast_hash_ring.rb +5 -1
- data/ext/fast_hash_ring.c +15 -4
- data/spec/fast_hash_ring_spec.rb +5 -14
- metadata +2 -2
data/Rakefile
CHANGED
|
@@ -20,7 +20,7 @@ CLEAN.include('pkg', 'tmp')
|
|
|
20
20
|
|
|
21
21
|
gemspec = Gem::Specification.new do |s|
|
|
22
22
|
s.name = 'fast_hash_ring'
|
|
23
|
-
s.version = '0.1'
|
|
23
|
+
s.version = '0.1.1'
|
|
24
24
|
s.authors = [ 'Flinn' ]
|
|
25
25
|
s.email = 'flinn@actsasflinn.com'
|
|
26
26
|
s.homepage = 'http://github.com/actsasflinn/fast_hash_ring/'
|
|
@@ -51,7 +51,7 @@ Rake::GemPackageTask.new(gemspec) do |pkg|
|
|
|
51
51
|
pkg.need_tar = true
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
Rake::PackageTask.new('fast_hash_ring', '0.1') do |pkg|
|
|
54
|
+
Rake::PackageTask.new('fast_hash_ring', '0.1.1') do |pkg|
|
|
55
55
|
pkg.need_zip = true
|
|
56
56
|
pkg.package_files = FileList[
|
|
57
57
|
'COPYING',
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
# user system total real
|
|
2
|
+
# Hash Ring 44.970000 0.110000 45.080000 ( 45.194632)
|
|
3
|
+
# Fash Hash Ring 1.820000 0.000000 1.820000 ( 1.824138)
|
|
4
|
+
|
|
1
5
|
require 'benchmark'
|
|
2
6
|
require 'rubygems'
|
|
3
7
|
require 'faker'
|
|
@@ -15,7 +19,7 @@ weights = {}
|
|
|
15
19
|
end
|
|
16
20
|
|
|
17
21
|
keys = []
|
|
18
|
-
|
|
22
|
+
100_000.times do |i|
|
|
19
23
|
keys << Faker::Name.name
|
|
20
24
|
end
|
|
21
25
|
|
data/ext/fast_hash_ring.c
CHANGED
|
@@ -18,6 +18,13 @@ unsigned int hash_val(char *key, int x){
|
|
|
18
18
|
digest[0 + x]);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
static VALUE cFastHashRing_hash_val(VALUE vself, VALUE vkey, VALUE vx){
|
|
22
|
+
VALUE vhash;
|
|
23
|
+
|
|
24
|
+
vhash = INT2NUM(hash_val(RSTRING_PTR(vkey), NUM2INT(vx)));
|
|
25
|
+
return vhash;
|
|
26
|
+
}
|
|
27
|
+
|
|
21
28
|
static VALUE cFastHashRing_generate_circle(VALUE vself){
|
|
22
29
|
VALUE vnodes, vweights, vring, vsorted_keys;
|
|
23
30
|
int i, j, n, vnodes_len;
|
|
@@ -71,16 +78,16 @@ static VALUE cFastHashRing_gen_key(VALUE vself, VALUE vstring_key){
|
|
|
71
78
|
return INT2NUM(key);
|
|
72
79
|
}
|
|
73
80
|
|
|
74
|
-
|
|
81
|
+
static VALUE cFastHashRing_bisect(VALUE vself, VALUE vsorted_keys, VALUE vkey){
|
|
75
82
|
int i, vsorted_keys_len;
|
|
76
83
|
|
|
77
84
|
vsorted_keys_len = RARRAY_LEN(vsorted_keys);
|
|
78
85
|
for(i=0;i<vsorted_keys_len;i++){
|
|
79
86
|
VALUE vsorted_key = rb_ary_entry(vsorted_keys, i);
|
|
80
|
-
if (NUM2LONG(vkey) < NUM2LONG(vsorted_key)) return i;
|
|
87
|
+
if (NUM2LONG(vkey) < NUM2LONG(vsorted_key)) return INT2NUM(i);
|
|
81
88
|
}
|
|
82
89
|
|
|
83
|
-
return vsorted_keys_len;
|
|
90
|
+
return INT2NUM(vsorted_keys_len);
|
|
84
91
|
}
|
|
85
92
|
|
|
86
93
|
static VALUE cFastHashRing_get_node_pos(VALUE vself, VALUE vstring_key){
|
|
@@ -94,7 +101,7 @@ static VALUE cFastHashRing_get_node_pos(VALUE vself, VALUE vstring_key){
|
|
|
94
101
|
vsorted_keys = rb_iv_get(vself, "@sorted_keys");
|
|
95
102
|
|
|
96
103
|
vkey = cFastHashRing_gen_key(vself, vstring_key);
|
|
97
|
-
pos =
|
|
104
|
+
pos = NUM2INT(cFastHashRing_bisect(vself, vsorted_keys, vkey));
|
|
98
105
|
|
|
99
106
|
if(pos == RARRAY_LEN(vsorted_keys))
|
|
100
107
|
return INT2NUM(0);
|
|
@@ -189,4 +196,8 @@ void Init_fast_hash_ring(){
|
|
|
189
196
|
rb_define_method(cFastHashRing, "gen_key", cFastHashRing_gen_key, 1);
|
|
190
197
|
rb_define_method(cFastHashRing, "sorted_keys", cFastHashRing_sorted_keys, 0);
|
|
191
198
|
rb_define_method(cFastHashRing, "nodes", cFastHashRing_nodes, 0);
|
|
199
|
+
|
|
200
|
+
// Make specs work
|
|
201
|
+
rb_define_protected_method(cFastHashRing, "hash_val", cFastHashRing_hash_val, 2);
|
|
202
|
+
rb_define_protected_method(cFastHashRing, "bisect", cFastHashRing_bisect, 2);
|
|
192
203
|
}
|
data/spec/fast_hash_ring_spec.rb
CHANGED
|
@@ -22,15 +22,15 @@ describe FastHashRing do
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
it "should return 0 if it less than the first element" do
|
|
25
|
-
@ring.bisect
|
|
25
|
+
@ring.send(:bisect, @test_array, 5).should eql(0)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
it "should return the index it should go into to maintain order" do
|
|
29
|
-
@ring.bisect
|
|
29
|
+
@ring.send(:bisect, @test_array, 15).should eql(1)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
it "should return the final index if greater than all items" do
|
|
33
|
-
@ring.bisect
|
|
33
|
+
@ring.send(:bisect, @test_array, 40).should eql(3)
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -149,19 +149,10 @@ describe FastHashRing do
|
|
|
149
149
|
@ring = FastHashRing.new(['a'])
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
-
it "should
|
|
153
|
-
random_string = 'some random string'
|
|
154
|
-
|
|
155
|
-
m = Digest::MD5.new
|
|
156
|
-
m.update(random_string)
|
|
157
|
-
|
|
158
|
-
@ring._hash_digest(random_string).should eql(m.digest)
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
it "should match the python output for _hash_val" do
|
|
152
|
+
it "should match the python output for hash_val" do
|
|
162
153
|
# This output was taken directly from the python library
|
|
163
154
|
py_output = 2830561728
|
|
164
|
-
ruby_output = @ring.
|
|
155
|
+
ruby_output = @ring.send(:hash_val, 'a', 4)
|
|
165
156
|
|
|
166
157
|
ruby_output.should eql(py_output)
|
|
167
158
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fast_hash_ring
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Flinn
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-11-
|
|
12
|
+
date: 2009-11-21 00:00:00 -05:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies: []
|
|
15
15
|
|