ruby-xxHash 0.1.1 → 0.4.0.2
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +4 -0
- data/README.md +3 -2
- data/lib/ruby-xxhash/version.rb +2 -2
- data/lib/ruby-xxhash.rb +61 -93
- data/lib/ruby-xxhash32.rb +123 -0
- data/lib/ruby-xxhash64.rb +147 -0
- data/ruby-xxHash.gemspec +1 -1
- data/spec/{results.yaml → results32.yaml} +0 -0
- data/spec/results64.yaml +16 -0
- data/spec/xxhash_spec.rb +87 -9
- metadata +26 -30
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9166f045e1d36804e8c47a926f439d057294ad8ab680491efa6e9c9152e0eb71
|
4
|
+
data.tar.gz: dae6a2bc9ba43cb4e38753d8f670caa83d79a3800ebb5c44f0091e0c9a0f2767
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a9f8e8326dce8c1d8e94e0902b900cb86c9526a2d427020fc7fae0da159b7a2c12d5775e62c9c6cd318ff1787658e0bb745f02dd4f7ce9a365a207c23ce26b77
|
7
|
+
data.tar.gz: 7f9aaa93e9222de63661ecda365373142cffe79dda430763dba42b495663fb85cc0d40fbce177255c16b79a145791cf0129c767366210108f2457e55918cfb0c
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# XXhash
|
1
|
+
# XXhash [](https://travis-ci.org/justinwsmith/ruby-xxhash)
|
2
2
|
|
3
|
-
This gem provides a pure Ruby implementation of the XXhash32 hashing
|
3
|
+
This gem provides a pure Ruby implementation of the XXhash32 and XXhash64 hashing algorithms described here: https://code.google.com/p/xxhash/.
|
4
4
|
|
5
5
|
It's intended to be (mostly) source compatible with the Gem provided by nashby: https://github.com/nashby/xxhash
|
6
6
|
|
@@ -27,6 +27,7 @@ text = "test"
|
|
27
27
|
seed = 12345
|
28
28
|
|
29
29
|
XXhash.xxh32(text, seed) # => 3834992036
|
30
|
+
XXhash.xxh64(text, seed) # => 7624679986283906467
|
30
31
|
```
|
31
32
|
|
32
33
|
## Contributing
|
data/lib/ruby-xxhash/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "0.
|
1
|
+
module XXhash
|
2
|
+
VERSION = "0.4.0.2"
|
3
3
|
end
|
data/lib/ruby-xxhash.rb
CHANGED
@@ -1,128 +1,96 @@
|
|
1
|
-
|
1
|
+
# Copyright 2014 Justin W. Smith
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@@prime32_3 = 3266489917
|
8
|
-
@@prime32_4 = 668265263
|
9
|
-
@@prime32_5 = 374761393
|
3
|
+
require "ruby-xxhash/version"
|
4
|
+
require "digest"
|
5
|
+
require "ruby-xxhash32"
|
6
|
+
require "ruby-xxhash64"
|
10
7
|
|
11
|
-
@@thirtytwo1s = (2**32-1)
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
xxh.
|
16
|
-
xxh.
|
9
|
+
module XXhash
|
10
|
+
def self.xxh32(input, seed = 0)
|
11
|
+
xxh = XXhashInternal::XXhash32.new(seed)
|
12
|
+
xxh.update(input)
|
13
|
+
xxh.digest
|
17
14
|
end
|
18
15
|
|
19
|
-
def
|
20
|
-
xxh =
|
16
|
+
def self.xxh32_stream(io, seed = 0, chunk = 32)
|
17
|
+
xxh = XXhashInternal::XXhash32.new(seed)
|
21
18
|
|
22
19
|
while(data = io.read(chunk))
|
23
|
-
xxh.
|
20
|
+
xxh.update(data)
|
24
21
|
end
|
25
22
|
|
26
|
-
xxh.
|
23
|
+
xxh.digest
|
27
24
|
end
|
28
25
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@v3 = seed + 0
|
34
|
-
@v4 = seed - @@prime32_1
|
35
|
-
@total_len = 0
|
36
|
-
@memory = Array.new(@@mem_total_size)
|
37
|
-
@memsize = 0
|
26
|
+
def self.xxh64(input, seed = 0)
|
27
|
+
xxh = XXhashInternal::XXhash64.new(seed)
|
28
|
+
xxh.update(input)
|
29
|
+
xxh.digest
|
38
30
|
end
|
39
31
|
|
32
|
+
def self.xxh64_stream(io, seed = 0, chunk = 32)
|
33
|
+
xxh = XXhashInternal::XXhash64.new(seed)
|
40
34
|
|
41
|
-
|
42
|
-
|
43
|
-
bytes = bytes.unpack("C*")
|
35
|
+
while(data = io.read(chunk))
|
36
|
+
xxh.update(data)
|
44
37
|
end
|
45
38
|
|
46
|
-
|
47
|
-
|
48
|
-
p = 0
|
49
|
-
|
50
|
-
while (remaining = (bytes.length - p)) > 0
|
51
|
-
|
52
|
-
mem_avail = @@mem_total_size - @memsize
|
53
|
-
|
54
|
-
if(remaining < mem_avail)
|
55
|
-
@memory[@memsize, remaining] = bytes[p, remaining]
|
56
|
-
@memsize += remaining
|
57
|
-
break
|
58
|
-
end
|
39
|
+
xxh.digest
|
40
|
+
end
|
59
41
|
|
60
|
-
|
42
|
+
end
|
61
43
|
|
62
|
-
i = 0
|
63
|
-
[:v1, :v2, :v3, :v4].each do |m|
|
64
|
-
p32 = uint32(
|
65
|
-
@memory[i] |
|
66
|
-
(@memory[i+1] << 8) |
|
67
|
-
(@memory[i+2] << 16) |
|
68
|
-
(@memory[i+3] << 24))
|
69
44
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
45
|
+
module Digest
|
46
|
+
class XXHash < Digest::Class
|
47
|
+
attr_reader :digest_length
|
48
|
+
def initialize bitlen, seed = 0
|
49
|
+
case bitlen
|
50
|
+
when 32
|
51
|
+
@hash = XXhash::XXhashInternal::XXhash32.new(seed)
|
52
|
+
when 64
|
53
|
+
@hash = XXhash::XXhashInternal::XXhash64.new(seed)
|
54
|
+
else
|
55
|
+
raise ArgumentError, "Unsupported bit length: %s" % bitlen.inspect
|
74
56
|
end
|
57
|
+
@digest_length = bitlen
|
58
|
+
end
|
75
59
|
|
76
|
-
|
77
|
-
@
|
60
|
+
def update chunk
|
61
|
+
@hash.update(chunk)
|
78
62
|
end
|
79
63
|
|
80
|
-
|
81
|
-
|
64
|
+
def digest val=nil
|
65
|
+
if val
|
66
|
+
@hash.update val
|
67
|
+
end
|
82
68
|
|
83
|
-
|
84
|
-
if @total_len >= 16
|
85
|
-
h32 = ((@v1 << 1) | (@v1 >> (32 - 1))) +
|
86
|
-
((@v2 << 7) | (@v2 >> (32 - 7))) +
|
87
|
-
((@v3 << 12) | (@v3 >> (32 - 12))) +
|
88
|
-
((@v4 << 18) | (@v4 >> (32 - 18)))
|
89
|
-
else
|
90
|
-
h32 = @seed + @@prime32_5
|
69
|
+
@hash.digest
|
91
70
|
end
|
92
71
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
p32 = uint32(@memory[p] |
|
98
|
-
(@memory[p+1] << 8) |
|
99
|
-
(@memory[p+2] << 16) |
|
100
|
-
(@memory[p+3] << 24))
|
101
|
-
h32 = uint32(h32 + p32 * @@prime32_3)
|
102
|
-
h32 = uint32(uint32((h32 << 17) | (h32 >> (32 - 17))) * @@prime32_4)
|
103
|
-
p += 4
|
72
|
+
def digest! val=nil
|
73
|
+
result = digest(val)
|
74
|
+
@hash.reset
|
75
|
+
result
|
104
76
|
end
|
105
77
|
|
106
|
-
|
107
|
-
|
108
|
-
h32 = uint32(uint32((h32 << 11) | (h32 >> (32 - 11))) * @@prime32_1)
|
109
|
-
p += 1
|
78
|
+
def reset
|
79
|
+
@hash.reset
|
110
80
|
end
|
111
81
|
|
112
|
-
h32 ^= h32 >> 15
|
113
|
-
h32 = uint32(h32 * @@prime32_2)
|
114
|
-
h32 ^= h32 >> 13
|
115
|
-
h32 = uint32(h32 * @@prime32_3)
|
116
|
-
h32 ^= h32 >> 16
|
117
|
-
|
118
|
-
h32
|
119
82
|
end
|
120
83
|
|
121
|
-
|
122
|
-
|
123
|
-
|
84
|
+
class XXHash32 < Digest::XXHash
|
85
|
+
def initialize seed = 0
|
86
|
+
super(32, seed)
|
87
|
+
end
|
88
|
+
end
|
124
89
|
|
125
|
-
|
126
|
-
|
90
|
+
class XXHash64 < Digest::XXHash
|
91
|
+
def initialize seed = 0
|
92
|
+
super(64, seed)
|
93
|
+
end
|
127
94
|
end
|
95
|
+
|
128
96
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module XXhash
|
4
|
+
module XXhashInternal
|
5
|
+
class XXhash32
|
6
|
+
@@mem_total_size = 16
|
7
|
+
@@prime32_1 = 2654435761
|
8
|
+
@@prime32_2 = 2246822519
|
9
|
+
@@prime32_3 = 3266489917
|
10
|
+
@@prime32_4 = 668265263
|
11
|
+
@@prime32_5 = 374761393
|
12
|
+
|
13
|
+
@@thirtytwo1s = (2**32-1)
|
14
|
+
|
15
|
+
def initialize seed
|
16
|
+
@seed = seed
|
17
|
+
reset
|
18
|
+
end
|
19
|
+
|
20
|
+
def reset
|
21
|
+
@v1 = @seed + @@prime32_1 + @@prime32_2
|
22
|
+
@v2 = @seed + @@prime32_2
|
23
|
+
@v3 = @seed + 0
|
24
|
+
@v4 = @seed - @@prime32_1
|
25
|
+
@total_len = 0
|
26
|
+
@memory = Array.new(@@mem_total_size)
|
27
|
+
@memsize = 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def update bytes
|
31
|
+
if String === bytes
|
32
|
+
bytes = bytes.unpack("C*")
|
33
|
+
end
|
34
|
+
|
35
|
+
@total_len += bytes.length
|
36
|
+
|
37
|
+
p = 0
|
38
|
+
|
39
|
+
while (remaining = (bytes.length - p)) > 0
|
40
|
+
|
41
|
+
mem_avail = @@mem_total_size - @memsize
|
42
|
+
|
43
|
+
if(remaining < mem_avail)
|
44
|
+
@memory[@memsize, remaining] = bytes[p, remaining]
|
45
|
+
@memsize += remaining
|
46
|
+
break
|
47
|
+
end
|
48
|
+
|
49
|
+
@memory[@memsize, mem_avail] = bytes[p, mem_avail]
|
50
|
+
|
51
|
+
i = 0
|
52
|
+
[:v1, :v2, :v3, :v4].each do |m|
|
53
|
+
p32 = uint32(
|
54
|
+
@memory[i] |
|
55
|
+
(@memory[i+1] << 8) |
|
56
|
+
(@memory[i+2] << 16) |
|
57
|
+
(@memory[i+3] << 24))
|
58
|
+
|
59
|
+
v = uint32(self.send(m) + p32 * @@prime32_2)
|
60
|
+
v = uint32(uint32((v << 13) | (v >> (32 - 13))) * @@prime32_1)
|
61
|
+
self.send((m.to_s + "=").to_sym, v)
|
62
|
+
i += 4
|
63
|
+
end
|
64
|
+
|
65
|
+
p += mem_avail
|
66
|
+
@memsize = 0
|
67
|
+
end
|
68
|
+
|
69
|
+
return true
|
70
|
+
end
|
71
|
+
|
72
|
+
def digest val=nil
|
73
|
+
if val
|
74
|
+
update val
|
75
|
+
end
|
76
|
+
|
77
|
+
if @total_len >= 16
|
78
|
+
h32 = ((@v1 << 1) | (@v1 >> (32 - 1))) +
|
79
|
+
((@v2 << 7) | (@v2 >> (32 - 7))) +
|
80
|
+
((@v3 << 12) | (@v3 >> (32 - 12))) +
|
81
|
+
((@v4 << 18) | (@v4 >> (32 - 18)))
|
82
|
+
else
|
83
|
+
h32 = @seed + @@prime32_5
|
84
|
+
end
|
85
|
+
|
86
|
+
h32 = uint32(h32 + @total_len)
|
87
|
+
|
88
|
+
p = 0
|
89
|
+
while p <= (@memsize - 4)
|
90
|
+
p32 = uint32(@memory[p] |
|
91
|
+
(@memory[p+1] << 8) |
|
92
|
+
(@memory[p+2] << 16) |
|
93
|
+
(@memory[p+3] << 24))
|
94
|
+
h32 = uint32(h32 + p32 * @@prime32_3)
|
95
|
+
h32 = uint32(uint32((h32 << 17) | (h32 >> (32 - 17))) * @@prime32_4)
|
96
|
+
p += 4
|
97
|
+
end
|
98
|
+
|
99
|
+
while p < @memsize
|
100
|
+
h32 = uint32(h32 + @memory[p] * @@prime32_5)
|
101
|
+
h32 = uint32(uint32((h32 << 11) | (h32 >> (32 - 11))) * @@prime32_1)
|
102
|
+
p += 1
|
103
|
+
end
|
104
|
+
|
105
|
+
h32 ^= h32 >> 15
|
106
|
+
h32 = uint32(h32 * @@prime32_2)
|
107
|
+
h32 ^= h32 >> 13
|
108
|
+
h32 = uint32(h32 * @@prime32_3)
|
109
|
+
h32 ^= h32 >> 16
|
110
|
+
|
111
|
+
h32
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
attr_accessor :v1, :v2, :v3, :v4
|
117
|
+
|
118
|
+
def uint32(x)
|
119
|
+
x & @@thirtytwo1s
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require "ruby-xxhash/version"
|
2
|
+
|
3
|
+
module XXhash
|
4
|
+
module XXhashInternal
|
5
|
+
class XXhash64
|
6
|
+
@@mem_total_size = 32
|
7
|
+
@@prime64_1 = 11400714785074694791
|
8
|
+
@@prime64_2 = 14029467366897019727
|
9
|
+
@@prime64_3 = 1609587929392839161
|
10
|
+
@@prime64_4 = 9650029242287828579
|
11
|
+
@@prime64_5 = 2870177450012600261
|
12
|
+
|
13
|
+
@@sixtyfour1s = (2**64-1)
|
14
|
+
|
15
|
+
def initialize seed
|
16
|
+
@seed = seed
|
17
|
+
reset
|
18
|
+
end
|
19
|
+
|
20
|
+
def reset
|
21
|
+
@v1 = @seed + @@prime64_1 + @@prime64_2;
|
22
|
+
@v2 = @seed + @@prime64_2;
|
23
|
+
@v3 = @seed + 0;
|
24
|
+
@v4 = @seed - @@prime64_1;
|
25
|
+
@total_len = 0
|
26
|
+
@memory = Array.new(@@mem_total_size)
|
27
|
+
@memsize = 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def update bytes
|
31
|
+
if String === bytes
|
32
|
+
bytes = bytes.unpack("C*")
|
33
|
+
end
|
34
|
+
|
35
|
+
@total_len += bytes.length
|
36
|
+
|
37
|
+
p = 0
|
38
|
+
while (remaining = (bytes.length - p)) > 0
|
39
|
+
mem_avail = @@mem_total_size - @memsize
|
40
|
+
|
41
|
+
if(remaining < mem_avail)
|
42
|
+
@memory[@memsize, remaining] = bytes[p, remaining]
|
43
|
+
@memsize += remaining
|
44
|
+
break
|
45
|
+
end
|
46
|
+
|
47
|
+
@memory[@memsize, mem_avail] = bytes[p, mem_avail]
|
48
|
+
|
49
|
+
i = 0
|
50
|
+
[:v1, :v2, :v3, :v4].each do |m|
|
51
|
+
p64 = uint64(
|
52
|
+
@memory[i] |
|
53
|
+
(@memory[i+1] << 8) |
|
54
|
+
(@memory[i+2] << 16) |
|
55
|
+
(@memory[i+3] << 24) |
|
56
|
+
(@memory[i+4] << 32) |
|
57
|
+
(@memory[i+5] << 40) |
|
58
|
+
(@memory[i+6] << 48) |
|
59
|
+
(@memory[i+7] << 56))
|
60
|
+
|
61
|
+
v = uint64(self.send(m) + p64 * @@prime64_2)
|
62
|
+
v = uint64(uint64((v << 31) | (v >> (64 - 31))) * @@prime64_1)
|
63
|
+
self.send((m.to_s + "=").to_sym, v)
|
64
|
+
i += 8
|
65
|
+
end
|
66
|
+
|
67
|
+
p += mem_avail
|
68
|
+
@memsize = 0
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def digest val=nil
|
73
|
+
if val
|
74
|
+
update val
|
75
|
+
end
|
76
|
+
|
77
|
+
if @total_len >= 32
|
78
|
+
h64 = ((@v1 << 1) | (@v1 >> (64 - 1))) +
|
79
|
+
((@v2 << 7) | (@v2 >> (64 - 7))) +
|
80
|
+
((@v3 << 12) | (@v3 >> (64 - 12))) +
|
81
|
+
((@v4 << 18) | (@v4 >> (64 - 18)))
|
82
|
+
|
83
|
+
[:v1, :v2, :v3, :v4].each do |m|
|
84
|
+
v = uint64(self.send(m) * @@prime64_2)
|
85
|
+
v = uint64((v << 31) | (v >> (64 - 31)))
|
86
|
+
h64 ^= uint64(v * @@prime64_1)
|
87
|
+
h64 = h64 * @@prime64_1 + @@prime64_4
|
88
|
+
end
|
89
|
+
else
|
90
|
+
h64 = @seed + @@prime64_5
|
91
|
+
end
|
92
|
+
|
93
|
+
h64 = uint64(h64 + @total_len)
|
94
|
+
|
95
|
+
i = 0
|
96
|
+
while i <= (@memsize - 8)
|
97
|
+
v = uint64(
|
98
|
+
@memory[i] |
|
99
|
+
(@memory[i+1] << 8) |
|
100
|
+
(@memory[i+2] << 16) |
|
101
|
+
(@memory[i+3] << 24) |
|
102
|
+
(@memory[i+4] << 32) |
|
103
|
+
(@memory[i+5] << 40) |
|
104
|
+
(@memory[i+6] << 48) |
|
105
|
+
(@memory[i+7] << 56))
|
106
|
+
|
107
|
+
v = uint64(v * @@prime64_2)
|
108
|
+
h64 ^= uint64(uint64((v << 31) | (v >> (64 - 31))) * @@prime64_1)
|
109
|
+
h64 = uint64(uint64((h64 << 27) | (h64 >> (64 - 27))) * @@prime64_1 + @@prime64_4)
|
110
|
+
i += 8
|
111
|
+
end
|
112
|
+
|
113
|
+
if i <= (@memsize - 4)
|
114
|
+
v = @memory[i] |
|
115
|
+
(@memory[i+1] << 8) |
|
116
|
+
(@memory[i+2] << 16) |
|
117
|
+
(@memory[i+3] << 24)
|
118
|
+
h64 ^= uint64(v * @@prime64_1)
|
119
|
+
h64 = uint64(uint64((h64 << 23) | (h64 >> (64-23))) * @@prime64_2 + @@prime64_3)
|
120
|
+
i += 4
|
121
|
+
end
|
122
|
+
|
123
|
+
while i < @memsize
|
124
|
+
h64 ^= uint64(@memory[i] * @@prime64_5)
|
125
|
+
h64 = uint64(uint64((h64 << 11) | (h64 >> (64 - 11))) * @@prime64_1)
|
126
|
+
i += 1
|
127
|
+
end
|
128
|
+
|
129
|
+
h64 ^= h64 >> 33
|
130
|
+
h64 = uint64(h64 * @@prime64_2)
|
131
|
+
h64 ^= h64 >> 29
|
132
|
+
h64 = uint64(h64 * @@prime64_3)
|
133
|
+
h64 ^= h64 >> 32
|
134
|
+
|
135
|
+
h64
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
|
140
|
+
attr_accessor :v1, :v2, :v3, :v4
|
141
|
+
|
142
|
+
def uint64(x)
|
143
|
+
x & @@sixtyfour1s
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
data/ruby-xxHash.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler"
|
21
|
+
spec.add_development_dependency "bundler"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
24
|
end
|
File without changes
|
data/spec/results64.yaml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
? - test
|
3
|
+
- 123
|
4
|
+
: 3134990500624303823
|
5
|
+
? - ! 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, '
|
6
|
+
- 0
|
7
|
+
: 17031984226649854695
|
8
|
+
? - ! 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, '
|
9
|
+
- 1471
|
10
|
+
: 13163341760735734472
|
11
|
+
? - ! 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.'
|
12
|
+
- 0
|
13
|
+
: 14967567540383795520
|
14
|
+
? - ! 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.'
|
15
|
+
- 1471
|
16
|
+
: 4189552183125498197
|
data/spec/xxhash_spec.rb
CHANGED
@@ -1,34 +1,112 @@
|
|
1
1
|
#Copyright (c) 2012 Vasiliy Ermolovich
|
2
|
+
#Copyright (c) 2014 Justin W Smith
|
2
3
|
|
3
4
|
require 'spec_helper'
|
4
5
|
require 'stringio'
|
5
6
|
require 'yaml'
|
6
7
|
|
7
8
|
describe XXhash do
|
8
|
-
|
9
|
+
hash32 = YAML.load(IO.read "spec/results32.yaml")
|
10
|
+
hash64 = YAML.load(IO.read "spec/results64.yaml")
|
9
11
|
|
10
|
-
|
12
|
+
hash32.each do |key, value|
|
11
13
|
it 'returns correct hash' do
|
12
|
-
XXhash.xxh32(key[0], key[1]).
|
14
|
+
expect(XXhash.xxh32(key[0], key[1])).to eq(value)
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
18
|
+
hash64.each do |key, value|
|
19
|
+
it 'returns correct hash' do
|
20
|
+
expect(XXhash.xxh64(key[0], key[1])).to eq(value)
|
21
|
+
end
|
22
|
+
end
|
16
23
|
|
17
24
|
describe 'StreamingHash' do
|
18
|
-
it 'raises error if argument is not an IO object' do
|
19
|
-
expect { XXhash.xxh32_stream('test', 123)}.to raise_error
|
20
|
-
end
|
21
25
|
|
22
|
-
|
26
|
+
hash32.each do |key, value|
|
23
27
|
it 'returns correct hash' do
|
24
|
-
XXhash.xxh32_stream(StringIO.new(key[0]), key[1]).
|
28
|
+
expect(XXhash.xxh32_stream(StringIO.new(key[0]), key[1])).to eq(value)
|
25
29
|
end
|
26
30
|
end
|
27
31
|
|
28
32
|
it 'returns same hash for streamed files' do
|
29
33
|
h1 = XXhash.xxh32(File.read(__FILE__), 123)
|
30
34
|
h2 = XXhash.xxh32_stream(File.open(__FILE__), 123)
|
31
|
-
h1.
|
35
|
+
expect(h1).to eq(h2)
|
36
|
+
end
|
37
|
+
|
38
|
+
hash64.each do |key, value|
|
39
|
+
it 'returns correct hash' do
|
40
|
+
expect(XXhash.xxh64_stream(StringIO.new(key[0]), key[1])).to eq(value)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns same hash for streamed files' do
|
45
|
+
h1 = XXhash.xxh64(File.read(__FILE__), 123)
|
46
|
+
h2 = XXhash.xxh64_stream(File.open(__FILE__), 123)
|
47
|
+
expect(h1).to eq(h2)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def use_external_hash hash, io, chunk_size=1024
|
52
|
+
while chunk=io.read(chunk_size)
|
53
|
+
hash.update(chunk)
|
32
54
|
end
|
55
|
+
hash.digest
|
33
56
|
end
|
57
|
+
|
58
|
+
describe 'Digest::XXHash32' do
|
59
|
+
|
60
|
+
it 'returns the hash for streamed strings' do
|
61
|
+
StringIO.open('test') do |io|
|
62
|
+
xxhash = Digest::XXHash32.new(123)
|
63
|
+
result = use_external_hash xxhash, io
|
64
|
+
expect(result).to eq(2758658570)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'returns the hash for streamed files' do
|
69
|
+
h1 = XXhash.xxh32(File.read(__FILE__), 123)
|
70
|
+
xxhash = Digest::XXHash32.new(123)
|
71
|
+
result = use_external_hash xxhash, File.open(__FILE__)
|
72
|
+
expect(result).to eq(h1)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns correct hash after a reset' do
|
76
|
+
h1 = XXhash.xxh32(File.read(__FILE__), 123)
|
77
|
+
xxhash = Digest::XXHash32.new(123)
|
78
|
+
expect(xxhash.digest('test')).to eq(2758658570)
|
79
|
+
xxhash.reset
|
80
|
+
result = use_external_hash xxhash, File.open(__FILE__)
|
81
|
+
expect(result).to eq(h1)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'Digest::XXHash64' do
|
86
|
+
|
87
|
+
it 'returns the hash for streamed strings' do
|
88
|
+
StringIO.open('test') do |io|
|
89
|
+
xxhash = Digest::XXHash64.new(123)
|
90
|
+
result = use_external_hash xxhash, io
|
91
|
+
expect(result).to eq(3134990500624303823)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'returns the hash for streamed files' do
|
96
|
+
h1 = XXhash.xxh64(File.read(__FILE__), 123)
|
97
|
+
xxhash = Digest::XXHash64.new(123)
|
98
|
+
result = use_external_hash xxhash, File.open(__FILE__)
|
99
|
+
expect(result).to eq(h1)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns correct hash after a reset' do
|
103
|
+
h1 = XXhash.xxh64(File.read(__FILE__), 123)
|
104
|
+
xxhash = Digest::XXHash64.new(123)
|
105
|
+
expect(xxhash.digest('test')).to eq(3134990500624303823)
|
106
|
+
xxhash.reset
|
107
|
+
result = use_external_hash xxhash, File.open(__FILE__)
|
108
|
+
expect(result).to eq(h1)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
34
112
|
end
|
metadata
CHANGED
@@ -1,62 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-xxHash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Justin W Smith
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2022-02-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
19
|
+
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
26
|
+
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
description: A pure Ruby implementation of xxhash.
|
@@ -66,43 +59,46 @@ executables: []
|
|
66
59
|
extensions: []
|
67
60
|
extra_rdoc_files: []
|
68
61
|
files:
|
69
|
-
- .gitignore
|
62
|
+
- ".gitignore"
|
63
|
+
- ".travis.yml"
|
70
64
|
- Gemfile
|
71
65
|
- LICENSE.txt
|
72
66
|
- README.md
|
73
67
|
- Rakefile
|
74
68
|
- lib/ruby-xxhash.rb
|
75
69
|
- lib/ruby-xxhash/version.rb
|
70
|
+
- lib/ruby-xxhash32.rb
|
71
|
+
- lib/ruby-xxhash64.rb
|
76
72
|
- ruby-xxHash.gemspec
|
77
|
-
- spec/
|
73
|
+
- spec/results32.yaml
|
74
|
+
- spec/results64.yaml
|
78
75
|
- spec/spec_helper.rb
|
79
76
|
- spec/xxhash_spec.rb
|
80
77
|
homepage: https://github.com/justinwsmith/ruby-xxhash
|
81
78
|
licenses:
|
82
79
|
- MIT
|
83
|
-
|
80
|
+
metadata: {}
|
81
|
+
post_install_message:
|
84
82
|
rdoc_options: []
|
85
83
|
require_paths:
|
86
84
|
- lib
|
87
85
|
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
89
86
|
requirements:
|
90
|
-
- -
|
87
|
+
- - ">="
|
91
88
|
- !ruby/object:Gem::Version
|
92
89
|
version: '0'
|
93
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
-
none: false
|
95
91
|
requirements:
|
96
|
-
- -
|
92
|
+
- - ">="
|
97
93
|
- !ruby/object:Gem::Version
|
98
94
|
version: '0'
|
99
95
|
requirements: []
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
specification_version: 3
|
96
|
+
rubygems_version: 3.2.32
|
97
|
+
signing_key:
|
98
|
+
specification_version: 4
|
104
99
|
summary: A pure Ruby implementation of xxhash.
|
105
100
|
test_files:
|
106
|
-
- spec/
|
101
|
+
- spec/results32.yaml
|
102
|
+
- spec/results64.yaml
|
107
103
|
- spec/spec_helper.rb
|
108
104
|
- spec/xxhash_spec.rb
|