ruby-xxHash 0.0.2 → 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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This gem provides a pure Ruby implementation of the XXhash32 hashing algorithm described here: https://code.google.com/p/xxhash/.
4
4
 
5
- It's intended to be source compatible with the Gem provided by nashby: https://github.com/nashby/xxhash
5
+ It's intended to be (mostly) source compatible with the Gem provided by nashby: https://github.com/nashby/xxhash
6
6
 
7
7
  ## Installation
8
8
 
@@ -21,7 +21,7 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
  ```ruby
24
- require 'xxhash'
24
+ require 'ruby-xxhash'
25
25
 
26
26
  text = "test"
27
27
  seed = 12345
@@ -0,0 +1,128 @@
1
+ require "ruby-xxhash/version"
2
+
3
+ class XXhash
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 XXhash.xxh32(input, seed = 0)
14
+ xxh = XXhash.new(seed)
15
+ xxh.feed(input)
16
+ xxh.sum32
17
+ end
18
+
19
+ def XXhash.xxh32_stream(io, seed = 0, chunk = 32)
20
+ xxh = XXhash.new(seed)
21
+
22
+ while(data = io.read(chunk))
23
+ xxh.feed(data)
24
+ end
25
+
26
+ xxh.sum32
27
+ end
28
+
29
+ def initialize seed
30
+ @seed = seed
31
+ @v1 = seed + @@prime32_1 + @@prime32_2
32
+ @v2 = seed + @@prime32_2
33
+ @v3 = seed + 0
34
+ @v4 = seed - @@prime32_1
35
+ @total_len = 0
36
+ @memory = Array.new(@@mem_total_size)
37
+ @memsize = 0
38
+ end
39
+
40
+
41
+ def feed bytes
42
+ if String === bytes
43
+ bytes = bytes.unpack("C*")
44
+ end
45
+
46
+ @total_len += bytes.length
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
59
+
60
+ @memory[@memsize, mem_avail] = bytes[p, mem_avail]
61
+
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
+
70
+ v = uint32(self.send(m) + p32 * @@prime32_2)
71
+ v = uint32(uint32((v << 13) | (v >> (32 - 13))) * @@prime32_1)
72
+ self.send((m.to_s + "=").to_sym, v)
73
+ i += 4
74
+ end
75
+
76
+ p += mem_avail
77
+ @memsize = 0
78
+ end
79
+
80
+ return true
81
+ end
82
+
83
+ def sum32
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
91
+ end
92
+
93
+ h32 = uint32(h32 + @total_len)
94
+
95
+ p = 0
96
+ while p <= (@memsize - 4)
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
104
+ end
105
+
106
+ while p < @memsize
107
+ h32 = uint32(h32 + @memory[p] * @@prime32_5)
108
+ h32 = uint32(uint32((h32 << 11) | (h32 >> (32 - 11))) * @@prime32_1)
109
+ p += 1
110
+ end
111
+
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
+ end
120
+
121
+ private
122
+
123
+ attr_accessor :v1, :v2, :v3, :v4
124
+
125
+ def uint32(x)
126
+ x & @@thirtytwo1s
127
+ end
128
+ end
@@ -0,0 +1,3 @@
1
+ class XXhash
2
+ VERSION = "0.1.1"
3
+ end
data/ruby-xxHash.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'xxhash/version'
4
+ require 'ruby-xxhash/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "ruby-xxHash"
data/spec/results.yaml ADDED
@@ -0,0 +1,16 @@
1
+ ---
2
+ ? - test
3
+ - 123
4
+ : 2758658570
5
+ ? - ! 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, '
6
+ - 0
7
+ : 288417748
8
+ ? - ! 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, '
9
+ - 1471
10
+ : 3126436440
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
+ : 222574394
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
+ : 845537824
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'bundler/setup'
2
2
  Bundler.setup
3
3
 
4
- require 'xxhash'
4
+ require 'ruby-xxhash'
5
5
 
6
6
  RSpec.configure do |config|
7
7
  # some (optional) config here
data/spec/xxhash_spec.rb CHANGED
@@ -2,31 +2,27 @@
2
2
 
3
3
  require 'spec_helper'
4
4
  require 'stringio'
5
+ require 'yaml'
5
6
 
6
7
  describe XXhash do
7
- it 'returns correct hash' do
8
- XXhash.xxh32('test', 123).should eq(2758658570)
9
- end
8
+ hash = YAML.load(IO.read "spec/results.yaml")
10
9
 
11
- it 'returns correct hash' do
12
- XXhash.xxh32("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, ").should eq(0x1130e7d4)
10
+ hash.each do |key, value|
11
+ it 'returns correct hash' do
12
+ XXhash.xxh32(key[0], key[1]).should eq(value)
13
+ end
13
14
  end
14
15
 
15
- it 'returns correct hash' do
16
- XXhash.xxh32("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, ", 1471).should eq(0xba59a258)
17
- end
18
16
 
19
17
  describe 'StreamingHash' do
20
18
  it 'raises error if argument is not an IO object' do
21
19
  expect { XXhash.xxh32_stream('test', 123)}.to raise_error
22
20
  end
23
21
 
24
- it 'returns the correct hash for streamed strings' do
25
- XXhash.xxh32_stream(StringIO.new('test'), 123).should eq(2758658570)
26
- end
27
-
28
- it 'returns the correct hash for streamed strings' do
29
- XXhash.xxh32_stream(StringIO.new("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, "), 1471).should eq(0xba59a258)
22
+ hash.each do |key, value|
23
+ it 'returns correct hash' do
24
+ XXhash.xxh32_stream(StringIO.new(key[0]), key[1]).should eq(value)
25
+ end
30
26
  end
31
27
 
32
28
  it 'returns same hash for streamed files' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-xxHash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -71,9 +71,10 @@ files:
71
71
  - LICENSE.txt
72
72
  - README.md
73
73
  - Rakefile
74
- - lib/xxhash.rb
75
- - lib/xxhash/version.rb
74
+ - lib/ruby-xxhash.rb
75
+ - lib/ruby-xxhash/version.rb
76
76
  - ruby-xxHash.gemspec
77
+ - spec/results.yaml
77
78
  - spec/spec_helper.rb
78
79
  - spec/xxhash_spec.rb
79
80
  homepage: https://github.com/justinwsmith/ruby-xxhash
@@ -102,5 +103,6 @@ signing_key:
102
103
  specification_version: 3
103
104
  summary: A pure Ruby implementation of xxhash.
104
105
  test_files:
106
+ - spec/results.yaml
105
107
  - spec/spec_helper.rb
106
108
  - spec/xxhash_spec.rb
data/lib/xxhash.rb DELETED
@@ -1,128 +0,0 @@
1
- require "xxhash/version"
2
-
3
- class XXhash
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 XXhash.xxh32(input, seed = 0)
14
- xxh = XXhash.new(seed)
15
- xxh.feed(input)
16
- xxh.sum32
17
- end
18
-
19
- def XXhash.xxh32_stream(io, seed = 0, chunk = 1024)
20
- xxh = XXhash.new(seed)
21
-
22
- while(data = io.read(chunk))
23
- xxh.feed(data)
24
- end
25
-
26
- xxh.sum32
27
- end
28
-
29
- def initialize seed
30
- @seed = seed
31
- @v1 = seed + @@prime32_1 + @@prime32_2
32
- @v2 = seed + @@prime32_2
33
- @v3 = seed + 0
34
- @v4 = seed - @@prime32_1
35
- @total_len = 0
36
- @memory = Array.new(@@mem_total_size)
37
- @memsize = 0
38
- end
39
-
40
-
41
- def feed bytes
42
- if String === bytes
43
- bytes = bytes.unpack("C*")
44
- end
45
-
46
- @total_len += bytes.length
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
59
-
60
- @memory[@memsize, mem_avail] = bytes[p, mem_avail]
61
-
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
-
70
- v = uint32(self.send(m) + p32 * @@prime32_2)
71
- v = uint32(uint32((v << 13) | (v >> (32 - 13))) * @@prime32_1)
72
- self.send((m.to_s + "=").to_sym, v)
73
- i += 4
74
- end
75
-
76
- p += mem_avail
77
- @memsize = 0
78
- end
79
-
80
- return true
81
- end
82
-
83
- def sum32
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
91
- end
92
-
93
- h32 = uint32(h32 + @total_len)
94
-
95
- p = 0
96
- while p <= (@memsize - 4)
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
104
- end
105
-
106
- while p < @memsize
107
- h32 = uint32(h32 + @memory[p] * @@prime32_5)
108
- h32 = uint32(uint32((h32 << 11) | (h32 >> (32 - 11))) * @@prime32_1)
109
- p += 1
110
- end
111
-
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
- end
120
-
121
- private
122
-
123
- attr_accessor :v1, :v2, :v3, :v4
124
-
125
- def uint32(x)
126
- x & @@thirtytwo1s
127
- end
128
- end
@@ -1,3 +0,0 @@
1
- class XXhash
2
- VERSION = "0.0.2"
3
- end