hamster 0.3.2 → 0.3.3
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/lib/hamster/hash.rb +1 -1
- data/lib/hamster/list.rb +1 -1
- data/lib/hamster/set.rb +1 -1
- data/lib/hamster/version.rb +1 -1
- data/spec/hamster/hash/hash_spec.rb +16 -23
- data/spec/hamster/list/hash_spec.rb +6 -21
- data/spec/hamster/set/hash_spec.rb +6 -21
- metadata +2 -2
data/lib/hamster/hash.rb
CHANGED
@@ -124,7 +124,7 @@ module Hamster
|
|
124
124
|
def_delegator :self, :eql?, :==
|
125
125
|
|
126
126
|
def hash
|
127
|
-
reduce(0) { |
|
127
|
+
reduce(0) { |hash, key, value| (hash << 32) - hash + key.hash + value.hash }
|
128
128
|
end
|
129
129
|
|
130
130
|
def_delegator :self, :dup, :uniq
|
data/lib/hamster/list.rb
CHANGED
data/lib/hamster/set.rb
CHANGED
data/lib/hamster/version.rb
CHANGED
@@ -6,37 +6,30 @@ describe Hamster::Hash do
|
|
6
6
|
|
7
7
|
describe "#hash" do
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
it "returns 0" do
|
16
|
-
@result.should == 0
|
17
|
-
end
|
18
|
-
|
9
|
+
it "values are sufficiently distributed" do
|
10
|
+
(1..4000)
|
11
|
+
.each_slice(4)
|
12
|
+
.map { |ka, va, kb, vb| Hamster.hash(ka => va, kb => vb).hash }
|
13
|
+
.uniq
|
14
|
+
.size.should == 1000
|
19
15
|
end
|
20
16
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
attr_reader :hash
|
17
|
+
it "differs given the same keys and different values" do
|
18
|
+
Hamster.hash("ka" => "va").hash.should_not == Hamster.hash("ka" => "vb").hash
|
19
|
+
end
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
21
|
+
it "differs given the same values and different keys" do
|
22
|
+
Hamster.hash("ka" => "va").hash.should_not == Hamster.hash("kb" => "va").hash
|
23
|
+
end
|
30
24
|
|
31
|
-
|
25
|
+
describe "on an empty hash" do
|
32
26
|
|
33
27
|
before do
|
34
|
-
|
35
|
-
@result = hash.hash
|
28
|
+
@result = Hamster.hash.hash
|
36
29
|
end
|
37
30
|
|
38
|
-
it "returns
|
39
|
-
@result.should ==
|
31
|
+
it "returns 0" do
|
32
|
+
@result.should == 0
|
40
33
|
end
|
41
34
|
|
42
35
|
end
|
@@ -30,27 +30,12 @@ describe Hamster::List do
|
|
30
30
|
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
def initialize(h)
|
40
|
-
@hash = h
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
before do
|
46
|
-
list = Hamster.list(Item.new(19), Item.new(31), Item.new(107))
|
47
|
-
@result = list.hash
|
48
|
-
end
|
49
|
-
|
50
|
-
it "returns XOR of each item's hash" do
|
51
|
-
@result.should == 103
|
52
|
-
end
|
53
|
-
|
33
|
+
it "values are sufficiently distributed" do
|
34
|
+
(1..4000)
|
35
|
+
.each_slice(4)
|
36
|
+
.map { |a, b, c, d| Hamster.list(a, b, c, d).hash }
|
37
|
+
.uniq
|
38
|
+
.size.should == 1000
|
54
39
|
end
|
55
40
|
|
56
41
|
end
|
@@ -18,27 +18,12 @@ describe Hamster::Set do
|
|
18
18
|
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
def initialize(h)
|
28
|
-
@hash = h
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
before do
|
34
|
-
set = Hamster.set(Item.new(19), Item.new(31), Item.new(107))
|
35
|
-
@result = set.hash
|
36
|
-
end
|
37
|
-
|
38
|
-
it "returns XOR of each item's hash" do
|
39
|
-
@result.should == 103
|
40
|
-
end
|
41
|
-
|
21
|
+
it "values are sufficiently distributed" do
|
22
|
+
(1..4000)
|
23
|
+
.each_slice(4)
|
24
|
+
.map { |a, b, c, d| Hamster.set(a, b, c, d).hash }
|
25
|
+
.uniq
|
26
|
+
.size.should == 1000
|
42
27
|
end
|
43
28
|
|
44
29
|
end
|