ruby-xxHash 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4b572ac0c8cdae1cf7f5521976d4d6d914f90942
4
- data.tar.gz: 80fe87bebc85f75dc8e6e196c5fd8555091f24f8
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NmJmNWZiZDk1MmFhMTdkZWI5YWVhNjNlNGJjMDk3Y2JlNzEyNWEzZg==
5
+ data.tar.gz: !binary |-
6
+ MzY5ZWRmMWEwNDA5OTM0YTZhNjZhNDMyN2ZlNTAyYTJmYWE5ZDEyYQ==
5
7
  SHA512:
6
- metadata.gz: 8c1d74e45ec38e2757685c04ab47e9e3ab4d98e746d9d804a62b6e6ebdc4aac6110497c09b7576b521ccb3be842e5ba966e8d31d728fd629e12d01babf2c451d
7
- data.tar.gz: 71652397a6f621ac2fca7dbe6a24749a67c3fec3adc21a5d6fc7f81ac1459946feb7de622c54f8b6c23a304ec15c7f5b8cd6e9b7cf051d24ec416c438b5bf433
8
+ metadata.gz: !binary |-
9
+ NjY3NGYzNTBhNzY2NmI5N2NhNDg3ZjNjNzdlYzYwODk2MTI3NTRkYzczZjc5
10
+ NzQ1M2E2Njc4NDNmNjlkZDEwMGFiMmU5NzdjMmE3ZjFmMDQwYzkzNWFmMjAy
11
+ NDc5ZjU2YjczNGJjMDgxODQ1NTQ2NmNlNTVmMmY0YjJlYTY2NzU=
12
+ data.tar.gz: !binary |-
13
+ M2MxMmUxNWUxMzUzZWVmMmQxZTBiYWNhYzMzMDcwNWYxNzA2OGYyYzdlMTFl
14
+ OGI3MmI1ZTA4ZTViOTBkNGM4ZjM4ZjhhOWFiNGM2M2Q3NmNmZjNiNGZjMDgw
15
+ ZGJkMzNhOTUzY2E3NzAyMWVkMDZjNmM2Y2E1ZTZjZTIxMGRkYzI=
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.2
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # XXhash
1
+ # XXhash [![Build Status](https://travis-ci.org/justinwsmith/ruby-xxhash.svg?branch=master)](https://travis-ci.org/justinwsmith/ruby-xxhash)
2
2
 
3
- This gem provides a pure Ruby implementation of the XXhash32 hashing algorithm described here: https://code.google.com/p/xxhash/.
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.rb CHANGED
@@ -4,37 +4,91 @@ require "ruby-xxhash/version"
4
4
  require "ruby-xxhash32"
5
5
  require "ruby-xxhash64"
6
6
 
7
- class XXhash
8
- def XXhash.xxh32(input, seed = 0)
9
- xxh = XXhash32.new(seed)
10
- xxh.feed(input)
11
- xxh.sum32
7
+ module XXhash
8
+ def self.xxh32(input, seed = 0)
9
+ xxh = XXhashInternal::XXhash32.new(seed)
10
+ xxh.update(input)
11
+ xxh.digest
12
12
  end
13
13
 
14
- def XXhash.xxh32_stream(io, seed = 0, chunk = 32)
15
- xxh = XXhash32.new(seed)
14
+ def self.xxh32_stream(io, seed = 0, chunk = 32)
15
+ xxh = XXhashInternal::XXhash32.new(seed)
16
16
 
17
17
  while(data = io.read(chunk))
18
- xxh.feed(data)
18
+ xxh.update(data)
19
19
  end
20
20
 
21
- xxh.sum32
21
+ xxh.digest
22
22
  end
23
23
 
24
- def XXhash.xxh64(input, seed = 0)
25
- xxh = XXhash64.new(seed)
26
- xxh.feed(input)
27
- xxh.sum64
24
+ def self.xxh64(input, seed = 0)
25
+ xxh = XXhashInternal::XXhash64.new(seed)
26
+ xxh.update(input)
27
+ xxh.digest
28
28
  end
29
29
 
30
- def XXhash.xxh64_stream(io, seed = 0, chunk = 32)
31
- xxh = XXhash64.new(seed)
30
+ def self.xxh64_stream(io, seed = 0, chunk = 32)
31
+ xxh = XXhashInternal::XXhash64.new(seed)
32
32
 
33
33
  while(data = io.read(chunk))
34
- xxh.feed(data)
34
+ xxh.update(data)
35
35
  end
36
36
 
37
- xxh.sum64
37
+ xxh.digest
38
38
  end
39
39
 
40
- end
40
+ end
41
+
42
+
43
+ module Digest
44
+ class XXHash < Digest::Class
45
+ attr_reader :digest_length
46
+ def initialize bitlen, seed = 0
47
+ case bitlen
48
+ when 32
49
+ @hash = XXhash::XXhashInternal::XXhash32.new(seed)
50
+ when 64
51
+ @hash = XXhash::XXhashInternal::XXhash64.new(seed)
52
+ else
53
+ raise ArgumentError, "Unsupported bit length: %s" % bitlen.inspect
54
+ end
55
+ @digest_length = bitlen
56
+ end
57
+
58
+ def update chunk
59
+ @hash.update(chunk)
60
+ end
61
+
62
+ def digest val=nil
63
+ if val
64
+ @hash.update val
65
+ end
66
+
67
+ @hash.digest
68
+ end
69
+
70
+ def digest! val=nil
71
+ result = digest(val)
72
+ @hash.reset
73
+ result
74
+ end
75
+
76
+ def reset
77
+ @hash.reset
78
+ end
79
+
80
+ end
81
+
82
+ class XXHash32 < Digest::XXHash
83
+ def initialize seed = 0
84
+ super(32, seed)
85
+ end
86
+ end
87
+
88
+ class XXHash64 < Digest::XXHash
89
+ def initialize seed = 0
90
+ super(64, seed)
91
+ end
92
+ end
93
+
94
+ end
data/lib/ruby-xxhash32.rb CHANGED
@@ -1,112 +1,123 @@
1
1
 
2
2
 
3
- class XXhash32
4
- @@mem_total_size = 16
5
- @@prime32_1 = 2654435761
6
- @@prime32_2 = 2246822519
7
- @@prime32_3 = 3266489917
8
- @@prime32_4 = 668265263
9
- @@prime32_5 = 374761393
10
-
11
- @@thirtytwo1s = (2**32-1)
12
-
13
- def initialize seed
14
- @seed = seed
15
- @v1 = seed + @@prime32_1 + @@prime32_2
16
- @v2 = seed + @@prime32_2
17
- @v3 = seed + 0
18
- @v4 = seed - @@prime32_1
19
- @total_len = 0
20
- @memory = Array.new(@@mem_total_size)
21
- @memsize = 0
22
- end
23
-
24
-
25
- def feed bytes
26
- if String === bytes
27
- bytes = bytes.unpack("C*")
28
- end
29
-
30
- @total_len += bytes.length
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
31
19
 
32
- p = 0
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
33
29
 
34
- while (remaining = (bytes.length - p)) > 0
30
+ def update bytes
31
+ if String === bytes
32
+ bytes = bytes.unpack("C*")
33
+ end
35
34
 
36
- mem_avail = @@mem_total_size - @memsize
35
+ @total_len += bytes.length
37
36
 
38
- if(remaining < mem_avail)
39
- @memory[@memsize, remaining] = bytes[p, remaining]
40
- @memsize += remaining
41
- break
42
- end
37
+ p = 0
43
38
 
44
- @memory[@memsize, mem_avail] = bytes[p, mem_avail]
39
+ while (remaining = (bytes.length - p)) > 0
45
40
 
46
- i = 0
47
- [:v1, :v2, :v3, :v4].each do |m|
48
- p32 = uint32(
49
- @memory[i] |
50
- (@memory[i+1] << 8) |
51
- (@memory[i+2] << 16) |
52
- (@memory[i+3] << 24))
53
-
54
- v = uint32(self.send(m) + p32 * @@prime32_2)
55
- v = uint32(uint32((v << 13) | (v >> (32 - 13))) * @@prime32_1)
56
- self.send((m.to_s + "=").to_sym, v)
57
- i += 4
58
- end
41
+ mem_avail = @@mem_total_size - @memsize
59
42
 
60
- p += mem_avail
61
- @memsize = 0
62
- end
43
+ if(remaining < mem_avail)
44
+ @memory[@memsize, remaining] = bytes[p, remaining]
45
+ @memsize += remaining
46
+ break
47
+ end
63
48
 
64
- return true
65
- end
49
+ @memory[@memsize, mem_avail] = bytes[p, mem_avail]
66
50
 
67
- def sum32
68
- if @total_len >= 16
69
- h32 = ((@v1 << 1) | (@v1 >> (32 - 1))) +
70
- ((@v2 << 7) | (@v2 >> (32 - 7))) +
71
- ((@v3 << 12) | (@v3 >> (32 - 12))) +
72
- ((@v4 << 18) | (@v4 >> (32 - 18)))
73
- else
74
- h32 = @seed + @@prime32_5
75
- end
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))
76
58
 
77
- h32 = uint32(h32 + @total_len)
78
-
79
- p = 0
80
- while p <= (@memsize - 4)
81
- p32 = uint32(@memory[p] |
82
- (@memory[p+1] << 8) |
83
- (@memory[p+2] << 16) |
84
- (@memory[p+3] << 24))
85
- h32 = uint32(h32 + p32 * @@prime32_3)
86
- h32 = uint32(uint32((h32 << 17) | (h32 >> (32 - 17))) * @@prime32_4)
87
- p += 4
88
- end
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
89
64
 
90
- while p < @memsize
91
- h32 = uint32(h32 + @memory[p] * @@prime32_5)
92
- h32 = uint32(uint32((h32 << 11) | (h32 >> (32 - 11))) * @@prime32_1)
93
- p += 1
94
- end
65
+ p += mem_avail
66
+ @memsize = 0
67
+ end
95
68
 
96
- h32 ^= h32 >> 15
97
- h32 = uint32(h32 * @@prime32_2)
98
- h32 ^= h32 >> 13
99
- h32 = uint32(h32 * @@prime32_3)
100
- h32 ^= h32 >> 16
69
+ return true
70
+ end
101
71
 
102
- h32
103
- end
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
104
113
 
105
- private
114
+ private
106
115
 
107
- attr_accessor :v1, :v2, :v3, :v4
116
+ attr_accessor :v1, :v2, :v3, :v4
108
117
 
109
- def uint32(x)
110
- x & @@thirtytwo1s
118
+ def uint32(x)
119
+ x & @@thirtytwo1s
120
+ end
121
+ end
111
122
  end
112
123
  end
data/lib/ruby-xxhash64.rb CHANGED
@@ -1,135 +1,147 @@
1
1
  require "ruby-xxhash/version"
2
2
 
3
- class XXhash64
4
- @@mem_total_size = 32
5
- @@prime64_1 = 11400714785074694791
6
- @@prime64_2 = 14029467366897019727
7
- @@prime64_3 = 1609587929392839161
8
- @@prime64_4 = 9650029242287828579
9
- @@prime64_5 = 2870177450012600261
10
-
11
- @@sixtyfour1s = (2**64-1)
12
-
13
- def initialize seed
14
- @seed = seed
15
- @v1 = seed + @@prime64_1 + @@prime64_2;
16
- @v2 = seed + @@prime64_2;
17
- @v3 = seed + 0;
18
- @v4 = seed - @@prime64_1;
19
- @total_len = 0
20
- @memory = Array.new(@@mem_total_size)
21
- @memsize = 0
22
- end
23
-
24
- def feed bytes
25
- if String === bytes
26
- bytes = bytes.unpack("C*")
27
- end
28
-
29
- @total_len += bytes.length
30
-
31
- p = 0
32
- while (remaining = (bytes.length - p)) > 0
33
- mem_avail = @@mem_total_size - @memsize
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
34
19
 
35
- if(remaining < mem_avail)
36
- @memory[@memsize, remaining] = bytes[p, remaining]
37
- @memsize += remaining
38
- break
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
39
28
  end
40
29
 
41
- @memory[@memsize, mem_avail] = bytes[p, mem_avail]
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
42
71
 
43
- i = 0
44
- [:v1, :v2, :v3, :v4].each do |m|
45
- p64 = uint64(
46
- @memory[i] |
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] |
47
115
  (@memory[i+1] << 8) |
48
116
  (@memory[i+2] << 16) |
49
- (@memory[i+3] << 24) |
50
- (@memory[i+4] << 32) |
51
- (@memory[i+5] << 40) |
52
- (@memory[i+6] << 48) |
53
- (@memory[i+7] << 56))
54
-
55
- v = uint64(self.send(m) + p64 * @@prime64_2)
56
- v = uint64(uint64((v << 31) | (v >> (64 - 31))) * @@prime64_1)
57
- self.send((m.to_s + "=").to_sym, v)
58
- i += 8
59
- end
60
-
61
- p += mem_avail
62
- @memsize = 0
63
- end
64
- end
65
-
66
- def sum64
67
- if @total_len >= 32
68
- h64 = ((@v1 << 1) | (@v1 >> (64 - 1))) +
69
- ((@v2 << 7) | (@v2 >> (64 - 7))) +
70
- ((@v3 << 12) | (@v3 >> (64 - 12))) +
71
- ((@v4 << 18) | (@v4 >> (64 - 18)))
72
-
73
- [:v1, :v2, :v3, :v4].each do |m|
74
- v = uint64(self.send(m) * @@prime64_2)
75
- v = uint64((v << 31) | (v >> (64 - 31)))
76
- h64 ^= uint64(v * @@prime64_1)
77
- h64 = h64 * @@prime64_1 + @@prime64_4
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
78
136
  end
79
- else
80
- h64 = @seed + @@prime64_5
81
- end
82
137
 
83
- h64 = uint64(h64 + @total_len)
84
-
85
- i = 0
86
- while i <= (@memsize - 8)
87
- v = uint64(
88
- @memory[i] |
89
- (@memory[i+1] << 8) |
90
- (@memory[i+2] << 16) |
91
- (@memory[i+3] << 24) |
92
- (@memory[i+4] << 32) |
93
- (@memory[i+5] << 40) |
94
- (@memory[i+6] << 48) |
95
- (@memory[i+7] << 56))
96
-
97
- v = uint64(v * @@prime64_2)
98
- h64 ^= uint64(uint64((v << 31) | (v >> (64 - 31))) * @@prime64_1)
99
- h64 = uint64(uint64((h64 << 27) | (h64 >> (64 - 27))) * @@prime64_1 + @@prime64_4)
100
- i += 8
101
- end
138
+ private
102
139
 
103
- if i <= (@memsize - 4)
104
- v = @memory[i] |
105
- (@memory[i+1] << 8) |
106
- (@memory[i+2] << 16) |
107
- (@memory[i+3] << 24)
108
- h64 ^= uint64(v * @@prime64_1)
109
- h64 = uint64(uint64((h64 << 23) | (h64 >> (64-23))) * @@prime64_2 + @@prime64_3)
110
- i += 4
111
- end
140
+ attr_accessor :v1, :v2, :v3, :v4
112
141
 
113
- while i < @memsize
114
- h64 ^= uint64(@memory[i] * @@prime64_5)
115
- h64 = uint64(uint64((h64 << 11) | (h64 >> (64 - 11))) * @@prime64_1)
116
- i += 1
142
+ def uint64(x)
143
+ x & @@sixtyfour1s
144
+ end
117
145
  end
118
-
119
- h64 ^= h64 >> 33
120
- h64 = uint64(h64 * @@prime64_2)
121
- h64 ^= h64 >> 29
122
- h64 = uint64(h64 * @@prime64_3)
123
- h64 ^= h64 >> 32
124
-
125
- h64
126
- end
127
-
128
- private
129
-
130
- attr_accessor :v1, :v2, :v3, :v4
131
-
132
- def uint64(x)
133
- x & @@sixtyfour1s
134
146
  end
135
147
  end
data/spec/xxhash_spec.rb CHANGED
@@ -22,9 +22,6 @@ describe XXhash do
22
22
  end
23
23
 
24
24
  describe 'StreamingHash' do
25
- it 'raises error if argument is not an IO object' do
26
- expect { XXhash.xxh32_stream('test', 123)}.to raise_error
27
- end
28
25
 
29
26
  hash32.each do |key, value|
30
27
  it 'returns correct hash' do
@@ -38,10 +35,6 @@ describe XXhash do
38
35
  expect(h1).to eq(h2)
39
36
  end
40
37
 
41
- it 'raises error if argument is not an IO object' do
42
- expect { XXhash.xxh64_stream('test', 123)}.to raise_error
43
- end
44
-
45
38
  hash64.each do |key, value|
46
39
  it 'returns correct hash' do
47
40
  expect(XXhash.xxh64_stream(StringIO.new(key[0]), key[1])).to eq(value)
@@ -54,4 +47,66 @@ describe XXhash do
54
47
  expect(h1).to eq(h2)
55
48
  end
56
49
  end
50
+
51
+ def use_external_hash hash, io, chunk_size=1024
52
+ while chunk=io.read(chunk_size)
53
+ hash.update(chunk)
54
+ end
55
+ hash.digest
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
+
57
112
  end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-xxHash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin W Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-09 00:00:00.000000000 Z
11
+ date: 2015-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - ! '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: A pure Ruby implementation of xxhash.
@@ -59,7 +59,8 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - ".gitignore"
62
+ - .gitignore
63
+ - .travis.yml
63
64
  - Gemfile
64
65
  - LICENSE.txt
65
66
  - README.md
@@ -83,17 +84,17 @@ require_paths:
83
84
  - lib
84
85
  required_ruby_version: !ruby/object:Gem::Requirement
85
86
  requirements:
86
- - - ">="
87
+ - - ! '>='
87
88
  - !ruby/object:Gem::Version
88
89
  version: '0'
89
90
  required_rubygems_version: !ruby/object:Gem::Requirement
90
91
  requirements:
91
- - - ">="
92
+ - - ! '>='
92
93
  - !ruby/object:Gem::Version
93
94
  version: '0'
94
95
  requirements: []
95
96
  rubyforge_project:
96
- rubygems_version: 2.2.2
97
+ rubygems_version: 2.4.8
97
98
  signing_key:
98
99
  specification_version: 4
99
100
  summary: A pure Ruby implementation of xxhash.