mmh3 0.3.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.github/workflows/build.yml +14 -14
- data/.github/workflows/coverage.yml +24 -0
- data/.rubocop.yml +50 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +13 -3
- data/LICENSE.txt +1 -1
- data/README.md +14 -6
- data/Rakefile +9 -3
- data/Steepfile +20 -0
- data/lib/mmh3/version.rb +1 -1
- data/lib/mmh3.rb +61 -28
- data/mmh3.gemspec +4 -1
- data/sig/mmh3.rbs +18 -0
- metadata +13 -9
- data/bin/console +0 -14
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70a69ac210acc55f49b85764ddacced777cd5b14c515c587b22e77a08479356e
|
4
|
+
data.tar.gz: 320c6db6188375dd16f065164691af0c254bcdc01968a5dd7318b087c6bdc896
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b533e1bf9b5bb655eef411e0b4f5e6cf184dfab4c9053513771941aa851f2abc768c2d81c6c97ebd37d2af7232d8f091cb9511fb8e6f2b23759727e944872555
|
7
|
+
data.tar.gz: dbf836b9f3e3f7cef52aa4aa414f58f960592533f40d6bbf885250ee2ce36d12bd68dd43b2c3b0417d3fbc76c5222be94dd9367b26c419d0f768fb140cbbd2c5
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: github-ci
|
data/.github/workflows/build.yml
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
name:
|
1
|
+
name: build
|
2
2
|
|
3
|
-
on: [push]
|
3
|
+
on: [push, pull_request]
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
build:
|
7
|
-
|
8
7
|
runs-on: ubuntu-latest
|
9
|
-
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
ruby: [ '2.7', '3.0', '3.1' ]
|
10
12
|
steps:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
bundle install --jobs 4 --retry 3
|
20
|
-
bundle exec rake
|
13
|
+
- uses: actions/checkout@v3
|
14
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
15
|
+
uses: ruby/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
ruby-version: ${{ matrix.ruby }}
|
18
|
+
bundler-cache: true
|
19
|
+
- name: Build and test with Rake
|
20
|
+
run: bundle exec rake
|
@@ -0,0 +1,24 @@
|
|
1
|
+
name: coverage
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ main ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ main ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
coverage:
|
11
|
+
runs-on: ubuntu-20.04
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v2
|
14
|
+
- name: Set up Ruby 2.7
|
15
|
+
uses: ruby/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
ruby-version: '2.7'
|
18
|
+
bundler-cache: true
|
19
|
+
- name: Build and test with Rake
|
20
|
+
run: bundle exec rake
|
21
|
+
- name: Coveralls GitHub Action
|
22
|
+
uses: coverallsapp/github-action@v1.1.2
|
23
|
+
with:
|
24
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-performance
|
3
|
+
- rubocop-rake
|
4
|
+
- rubocop-rspec
|
5
|
+
|
6
|
+
AllCops:
|
7
|
+
NewCops: enable
|
8
|
+
DisplayCopNames: true
|
9
|
+
DisplayStyleGuide: true
|
10
|
+
Exclude:
|
11
|
+
- 'tmp/**/*'
|
12
|
+
- 'vendor/**/*'
|
13
|
+
- 'Steepfile'
|
14
|
+
|
15
|
+
Gemspec/RequiredRubyVersion:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Layout/LineLength:
|
19
|
+
IgnoredPatterns: ['(\A|\s)#']
|
20
|
+
|
21
|
+
Metrics/BlockLength:
|
22
|
+
Exclude:
|
23
|
+
- 'spec/**/*'
|
24
|
+
|
25
|
+
Metrics/ParameterLists:
|
26
|
+
Max: 8
|
27
|
+
|
28
|
+
Naming/AccessorMethodName:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Naming/MethodParameterName:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
RSpec/ExampleLength:
|
35
|
+
Max: 16
|
36
|
+
|
37
|
+
RSpec/MultipleMemoizedHelpers:
|
38
|
+
Max: 8
|
39
|
+
|
40
|
+
RSpec/NamedSubject:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
RSpec/NestedGroups:
|
44
|
+
Max: 4
|
45
|
+
|
46
|
+
Style/NumericLiterals:
|
47
|
+
Enabled: false
|
48
|
+
|
49
|
+
Style/NumericPredicate:
|
50
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 1.2.0
|
2
|
+
- Refactor codes and configs with RuboCop.
|
3
|
+
|
4
|
+
# 1.1.0
|
5
|
+
- Add type declaration file: sig/mmh3.rbs
|
6
|
+
|
7
|
+
# 1.0.0
|
8
|
+
- Change to use keyword argument for seed and x64arch arguments.
|
9
|
+
- Refactor hash32 method.
|
10
|
+
- Update API documentation.
|
11
|
+
|
1
12
|
# 0.3.0
|
2
13
|
- Add option to hash128 method for generating a 128-bit hash value in x86 architecture.
|
3
14
|
|
data/Gemfile
CHANGED
@@ -1,7 +1,17 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in mmh3.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
|
-
gem
|
7
|
-
gem
|
8
|
+
gem 'rake', '~> 12.0'
|
9
|
+
gem 'rbs', '~> 1.2'
|
10
|
+
gem 'rspec', '~> 3.0'
|
11
|
+
gem 'rubocop', '~> 1.24'
|
12
|
+
gem 'rubocop-performance', '~> 1.14'
|
13
|
+
gem 'rubocop-rake', '~> 0.6.0'
|
14
|
+
gem 'rubocop-rspec', '~> 2.11'
|
15
|
+
gem 'simplecov', '~> 0.21'
|
16
|
+
gem 'simplecov-lcov', '~> 0.8'
|
17
|
+
gem 'steep', '~> 0.44'
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# Mmh3
|
2
2
|
|
3
|
-
![
|
3
|
+
[![Build Status](https://github.com/yoshoku/mmh3/workflows/build/badge.svg)](https://github.com/yoshoku/mmh3/actions?query=workflow%3Abuild)
|
4
|
+
[![Coverage Status](https://coveralls.io/repos/github/yoshoku/mmh3/badge.svg?branch=main)](https://coveralls.io/github/yoshoku/mmh3?branch=main)
|
4
5
|
[![Gem Version](https://badge.fury.io/rb/mmh3.svg)](https://badge.fury.io/rb/mmh3)
|
6
|
+
[![Documentation](https://img.shields.io/badge/api-reference-blue.svg)](https://rubydoc.info/gems/mmh3)
|
5
7
|
|
6
8
|
A pure Ruby implementation of [MurmurHash3](https://en.wikipedia.org/wiki/MurmurHash).
|
7
9
|
|
@@ -24,11 +26,17 @@ Or install it yourself as:
|
|
24
26
|
## Usage
|
25
27
|
|
26
28
|
```ruby
|
27
|
-
require 'mmh3'
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
irb(main):001:0> require 'mmh3'
|
30
|
+
=> true
|
31
|
+
irb(main):002:0> Mmh3.hash32('Hello, world', seed: 3)
|
32
|
+
=> 1659891412
|
33
|
+
irb(main):003:0> Mmh3.hash128('Hello, world', seed: 8)
|
34
|
+
=> 87198040132278428547135563345531192982
|
35
|
+
irb(main):004:0> Mmh3.hash32('Hello, world')
|
36
|
+
=> 1785891924
|
37
|
+
irb(main):005:0> Mmh3.hash32('Hello, world', seed: 0)
|
38
|
+
=> 1785891924
|
39
|
+
irb(main):006:0>
|
32
40
|
```
|
33
41
|
|
34
42
|
## Contributing
|
data/Rakefile
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
3
5
|
|
4
6
|
RSpec::Core::RakeTask.new(:spec)
|
5
7
|
|
6
|
-
|
8
|
+
require 'rubocop/rake_task'
|
9
|
+
|
10
|
+
RuboCop::RakeTask.new
|
11
|
+
|
12
|
+
task default: %i[rubocop spec]
|
data/Steepfile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
target :lib do
|
2
|
+
signature "sig"
|
3
|
+
#
|
4
|
+
check "lib" # Directory name
|
5
|
+
# check "Gemfile" # File name
|
6
|
+
# check "app/models/**/*.rb" # Glob
|
7
|
+
# # ignore "lib/templates/*.rb"
|
8
|
+
#
|
9
|
+
# # library "pathname", "set" # Standard libraries
|
10
|
+
# # library "strong_json" # Gems
|
11
|
+
end
|
12
|
+
|
13
|
+
# target :spec do
|
14
|
+
# signature "sig", "sig-private"
|
15
|
+
#
|
16
|
+
# check "spec"
|
17
|
+
#
|
18
|
+
# # library "pathname", "set" # Standard libraries
|
19
|
+
# # library "rspec"
|
20
|
+
# end
|
data/lib/mmh3/version.rb
CHANGED
data/lib/mmh3.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'mmh3/version'
|
4
4
|
|
5
|
+
# rubocop:disable Metrics/AbcSize, Metrics/BlockLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ModuleLength, Metrics/PerceivedComplexity
|
6
|
+
|
5
7
|
# This module consists module functions that implement MurmurHash3.
|
6
8
|
# MurmurHash3 was written by Austin Appleby, and is placed in the public domain.
|
7
9
|
# The author hereby disclaims copyright to this source code.
|
@@ -10,30 +12,38 @@ module Mmh3
|
|
10
12
|
|
11
13
|
# Generate a 32-bit hash value.
|
12
14
|
#
|
15
|
+
# @example
|
16
|
+
# require 'mmh3'
|
17
|
+
#
|
18
|
+
# puts Mmh3.hash32('Hello, world') # => 1785891924
|
19
|
+
#
|
13
20
|
# @param key [String] Key for hash value.
|
14
21
|
# @param seed [Integer] Seed for hash value.
|
15
22
|
#
|
16
23
|
# @return [Integer] Returns hash value.
|
17
|
-
def hash32(key, seed
|
24
|
+
def hash32(key, seed: 0)
|
18
25
|
keyb = key.to_s.bytes
|
19
26
|
key_len = keyb.size
|
20
27
|
n_blocks = key_len / 4
|
21
28
|
|
22
29
|
h = seed
|
23
30
|
(0...n_blocks * 4).step(4) do |bstart|
|
24
|
-
k = keyb
|
31
|
+
k = block32(keyb, bstart, 0)
|
25
32
|
h ^= scramble32(k)
|
26
33
|
h = rotl32(h, 13)
|
27
|
-
h = (h * 5 + 0xe6546b64) & 0xFFFFFFFF
|
34
|
+
h = ((h * 5) + 0xe6546b64) & 0xFFFFFFFF
|
28
35
|
end
|
29
36
|
|
30
37
|
tail_id = n_blocks * 4
|
31
38
|
tail_sz = key_len & 3
|
32
39
|
|
33
40
|
k = 0
|
41
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
34
42
|
k ^= keyb[tail_id + 2] << 16 if tail_sz >= 3
|
35
|
-
k ^= keyb[tail_id + 1] <<
|
36
|
-
k ^= keyb[tail_id + 0]
|
43
|
+
k ^= keyb[tail_id + 1] << 8 if tail_sz >= 2
|
44
|
+
k ^= keyb[tail_id + 0] if tail_sz >= 1
|
45
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
46
|
+
|
37
47
|
h ^= scramble32(k) if tail_sz.positive?
|
38
48
|
|
39
49
|
h = fmix32(h ^ key_len)
|
@@ -47,12 +57,17 @@ module Mmh3
|
|
47
57
|
|
48
58
|
# Generate a 128-bit hash value.
|
49
59
|
#
|
60
|
+
# @example
|
61
|
+
# require 'mmh3'
|
62
|
+
#
|
63
|
+
# puts Mmh3.hash128('Hello, world') # => 87198040132278428547135563345531192982
|
64
|
+
#
|
50
65
|
# @param key [String] Key for hash value.
|
51
66
|
# @param seed [Integer] Seed for hash value.
|
52
67
|
# @param x64arch [Boolean] Flag indicating whether to generate hash value for x64 architecture.
|
53
68
|
#
|
54
69
|
# @return [Integer] Returns hash value.
|
55
|
-
def hash128(key, seed
|
70
|
+
def hash128(key, seed: 0, x64arch: true)
|
56
71
|
return hash128_x86(key, seed) if x64arch == false
|
57
72
|
|
58
73
|
hash128_x64(key, seed)
|
@@ -81,7 +96,7 @@ module Mmh3
|
|
81
96
|
|
82
97
|
h1 = rotl64(h1, 27)
|
83
98
|
h1 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
|
84
|
-
h1 = (h1 * 5 + 0x52dce729) & 0xFFFFFFFFFFFFFFFF
|
99
|
+
h1 = ((h1 * 5) + 0x52dce729) & 0xFFFFFFFFFFFFFFFF
|
85
100
|
|
86
101
|
k2 = (k2 * c2) & 0xFFFFFFFFFFFFFFFF
|
87
102
|
k2 = rotl64(k2, 33)
|
@@ -90,13 +105,14 @@ module Mmh3
|
|
90
105
|
|
91
106
|
h2 = rotl64(h2, 31)
|
92
107
|
h2 = (h2 + h1) & 0xFFFFFFFFFFFFFFFF
|
93
|
-
h2 = (h2 * 5 + 0x38495ab5) & 0xFFFFFFFFFFFFFFFF
|
108
|
+
h2 = ((h2 * 5) + 0x38495ab5) & 0xFFFFFFFFFFFFFFFF
|
94
109
|
end
|
95
110
|
|
96
111
|
tail_id = n_blocks * 16
|
97
112
|
tail_sz = key_len & 15
|
98
113
|
|
99
114
|
k2 = 0
|
115
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
100
116
|
k2 ^= keyb[tail_id + 14] << 48 if tail_sz >= 15
|
101
117
|
k2 ^= keyb[tail_id + 13] << 40 if tail_sz >= 14
|
102
118
|
k2 ^= keyb[tail_id + 12] << 32 if tail_sz >= 13
|
@@ -104,6 +120,7 @@ module Mmh3
|
|
104
120
|
k2 ^= keyb[tail_id + 10] << 16 if tail_sz >= 11
|
105
121
|
k2 ^= keyb[tail_id + 9] << 8 if tail_sz >= 10
|
106
122
|
k2 ^= keyb[tail_id + 8] if tail_sz >= 9
|
123
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
107
124
|
|
108
125
|
if tail_sz > 8
|
109
126
|
k2 = (k2 * c2) & 0xFFFFFFFFFFFFFFFF
|
@@ -113,6 +130,7 @@ module Mmh3
|
|
113
130
|
end
|
114
131
|
|
115
132
|
k1 = 0
|
133
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
116
134
|
k1 ^= keyb[tail_id + 7] << 56 if tail_sz >= 8
|
117
135
|
k1 ^= keyb[tail_id + 6] << 48 if tail_sz >= 7
|
118
136
|
k1 ^= keyb[tail_id + 5] << 40 if tail_sz >= 6
|
@@ -121,6 +139,7 @@ module Mmh3
|
|
121
139
|
k1 ^= keyb[tail_id + 2] << 16 if tail_sz >= 3
|
122
140
|
k1 ^= keyb[tail_id + 1] << 8 if tail_sz >= 2
|
123
141
|
k1 ^= keyb[tail_id] if tail_sz >= 1
|
142
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
124
143
|
|
125
144
|
if tail_sz > 0
|
126
145
|
k1 = (k1 * c1) & 0xFFFFFFFFFFFFFFFF
|
@@ -141,7 +160,7 @@ module Mmh3
|
|
141
160
|
h1 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
|
142
161
|
h2 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
|
143
162
|
|
144
|
-
h2 << 64 | h1
|
163
|
+
(h2 << 64) | h1
|
145
164
|
end
|
146
165
|
|
147
166
|
def hash128_x86(key, seed = 0)
|
@@ -171,7 +190,7 @@ module Mmh3
|
|
171
190
|
|
172
191
|
h1 = rotl32(h1, 19)
|
173
192
|
h1 = (h1 + h2) & 0xFFFFFFFF
|
174
|
-
h1 = (h1 * 5 + 0x561ccd1b) & 0xFFFFFFFF
|
193
|
+
h1 = ((h1 * 5) + 0x561ccd1b) & 0xFFFFFFFF
|
175
194
|
|
176
195
|
k2 = (k2 * c2) & 0xFFFFFFFF
|
177
196
|
k2 = rotl32(k2, 16)
|
@@ -180,7 +199,7 @@ module Mmh3
|
|
180
199
|
|
181
200
|
h2 = rotl32(h2, 17)
|
182
201
|
h2 = (h2 + h3) & 0xFFFFFFFF
|
183
|
-
h2 = (h2 * 5 + 0x0bcaa747) & 0xFFFFFFFF
|
202
|
+
h2 = ((h2 * 5) + 0x0bcaa747) & 0xFFFFFFFF
|
184
203
|
|
185
204
|
k3 = (k3 * c3) & 0xFFFFFFFF
|
186
205
|
k3 = rotl32(k3, 17)
|
@@ -189,7 +208,7 @@ module Mmh3
|
|
189
208
|
|
190
209
|
h3 = rotl32(h3, 15)
|
191
210
|
h3 = (h3 + h4) & 0xFFFFFFFF
|
192
|
-
h3 = (h3 * 5 + 0x96cd1c35) & 0xFFFFFFFF
|
211
|
+
h3 = ((h3 * 5) + 0x96cd1c35) & 0xFFFFFFFF
|
193
212
|
|
194
213
|
k4 = (k4 * c4) & 0xFFFFFFFF
|
195
214
|
k4 = rotl32(k4, 18)
|
@@ -198,16 +217,18 @@ module Mmh3
|
|
198
217
|
|
199
218
|
h4 = rotl32(h4, 13)
|
200
219
|
h4 = (h4 + h1) & 0xFFFFFFFF
|
201
|
-
h4 = (h4 * 5 + 0x32ac3b17) & 0xFFFFFFFF
|
220
|
+
h4 = ((h4 * 5) + 0x32ac3b17) & 0xFFFFFFFF
|
202
221
|
end
|
203
222
|
|
204
223
|
tail_id = n_blocks * 16
|
205
224
|
tail_sz = key_len & 15
|
206
225
|
|
207
226
|
k4 = 0
|
227
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
208
228
|
k4 ^= keyb[tail_id + 14] << 16 if tail_sz >= 15
|
209
229
|
k4 ^= keyb[tail_id + 13] << 8 if tail_sz >= 14
|
210
230
|
k4 ^= keyb[tail_id + 12] if tail_sz >= 13
|
231
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
211
232
|
|
212
233
|
if tail_sz > 12
|
213
234
|
k4 = (k4 * c4) & 0xFFFFFFFF
|
@@ -217,10 +238,12 @@ module Mmh3
|
|
217
238
|
end
|
218
239
|
|
219
240
|
k3 = 0
|
241
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
220
242
|
k3 ^= keyb[tail_id + 11] << 24 if tail_sz >= 12
|
221
243
|
k3 ^= keyb[tail_id + 10] << 16 if tail_sz >= 11
|
222
244
|
k3 ^= keyb[tail_id + 9] << 8 if tail_sz >= 10
|
223
245
|
k3 ^= keyb[tail_id + 8] if tail_sz >= 9
|
246
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
224
247
|
|
225
248
|
if tail_sz > 8
|
226
249
|
k3 = (k3 * c3) & 0xFFFFFFFF
|
@@ -230,10 +253,12 @@ module Mmh3
|
|
230
253
|
end
|
231
254
|
|
232
255
|
k2 = 0
|
256
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
233
257
|
k2 ^= keyb[tail_id + 7] << 24 if tail_sz >= 8
|
234
258
|
k2 ^= keyb[tail_id + 6] << 16 if tail_sz >= 7
|
235
259
|
k2 ^= keyb[tail_id + 5] << 8 if tail_sz >= 6
|
236
260
|
k2 ^= keyb[tail_id + 4] if tail_sz >= 5
|
261
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
237
262
|
|
238
263
|
if tail_sz > 4
|
239
264
|
k2 = (k2 * c2) & 0xFFFFFFFF
|
@@ -243,10 +268,12 @@ module Mmh3
|
|
243
268
|
end
|
244
269
|
|
245
270
|
k1 = 0
|
271
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
246
272
|
k1 ^= keyb[tail_id + 3] << 24 if tail_sz >= 4
|
247
273
|
k1 ^= keyb[tail_id + 2] << 16 if tail_sz >= 3
|
248
274
|
k1 ^= keyb[tail_id + 1] << 8 if tail_sz >= 2
|
249
275
|
k1 ^= keyb[tail_id] if tail_sz >= 1
|
276
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
250
277
|
|
251
278
|
if tail_sz > 0
|
252
279
|
k1 = (k1 * c1) & 0xFFFFFFFF
|
@@ -279,33 +306,37 @@ module Mmh3
|
|
279
306
|
h3 = (h1 + h3) & 0xFFFFFFFF
|
280
307
|
h4 = (h1 + h4) & 0xFFFFFFFF
|
281
308
|
|
282
|
-
h4 << 96 | h3 << 64 | h2 << 32 | h1
|
309
|
+
(h4 << 96) | (h3 << 64) | (h2 << 32) | h1
|
283
310
|
end
|
284
311
|
|
285
312
|
def block32(kb, bstart, offset)
|
286
|
-
|
287
|
-
kb[bstart + offset +
|
288
|
-
kb[bstart + offset +
|
289
|
-
kb[bstart + offset]
|
313
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators, Layout/MultilineOperationIndentation
|
314
|
+
(kb[bstart + offset + 3] << 24) |
|
315
|
+
(kb[bstart + offset + 2] << 16) |
|
316
|
+
(kb[bstart + offset + 1] << 8) |
|
317
|
+
kb[bstart + offset]
|
318
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators, Layout/MultilineOperationIndentation
|
290
319
|
end
|
291
320
|
|
292
321
|
def block64(kb, bstart, offset)
|
293
|
-
|
294
|
-
kb[2 * bstart + (
|
295
|
-
kb[2 * bstart + (
|
296
|
-
kb[2 * bstart + (
|
297
|
-
kb[2 * bstart + (
|
298
|
-
kb[2 * bstart + (
|
299
|
-
kb[2 * bstart + (
|
300
|
-
kb[2 * bstart + offset]
|
322
|
+
# rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators, Layout/MultilineOperationIndentation
|
323
|
+
(kb[(2 * bstart) + (7 + offset)] << 56) |
|
324
|
+
(kb[(2 * bstart) + (6 + offset)] << 48) |
|
325
|
+
(kb[(2 * bstart) + (5 + offset)] << 40) |
|
326
|
+
(kb[(2 * bstart) + (4 + offset)] << 32) |
|
327
|
+
(kb[(2 * bstart) + (3 + offset)] << 24) |
|
328
|
+
(kb[(2 * bstart) + (2 + offset)] << 16) |
|
329
|
+
(kb[(2 * bstart) + (1 + offset)] << 8) |
|
330
|
+
kb[(2 * bstart) + offset]
|
331
|
+
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators, Layout/MultilineOperationIndentation
|
301
332
|
end
|
302
333
|
|
303
334
|
def rotl32(x, r)
|
304
|
-
(x << r | x >> (32 - r)) & 0xFFFFFFFF
|
335
|
+
((x << r) | (x >> (32 - r))) & 0xFFFFFFFF
|
305
336
|
end
|
306
337
|
|
307
338
|
def rotl64(x, r)
|
308
|
-
(x << r | x >> (64 - r)) & 0xFFFFFFFFFFFFFFFF
|
339
|
+
((x << r) | (x >> (64 - r))) & 0xFFFFFFFFFFFFFFFF
|
309
340
|
end
|
310
341
|
|
311
342
|
def scramble32(k)
|
@@ -332,3 +363,5 @@ module Mmh3
|
|
332
363
|
|
333
364
|
private_class_method :hash128_x64, :hash128_x86, :block32, :block64, :rotl32, :rotl64, :scramble32, :fmix32, :fmix64
|
334
365
|
end
|
366
|
+
|
367
|
+
# rubocop:enable Metrics/AbcSize, Metrics/BlockLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ModuleLength, Metrics/PerceivedComplexity
|
data/mmh3.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'lib/mmh3/version'
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
@@ -13,7 +15,7 @@ Gem::Specification.new do |spec|
|
|
13
15
|
|
14
16
|
spec.metadata['homepage_uri'] = spec.homepage
|
15
17
|
spec.metadata['source_code_uri'] = 'https://github.com/yoshoku/mmh3'
|
16
|
-
spec.metadata['changelog_uri'] = 'https://github.com/yoshoku/mmh3/blob/
|
18
|
+
spec.metadata['changelog_uri'] = 'https://github.com/yoshoku/mmh3/blob/main/CHANGELOG.md'
|
17
19
|
spec.metadata['documentation_uri'] = 'https://rubydoc.info/gems/mmh3'
|
18
20
|
|
19
21
|
# Specify which files should be added to the gem when it is released.
|
@@ -24,4 +26,5 @@ Gem::Specification.new do |spec|
|
|
24
26
|
spec.bindir = 'exe'
|
25
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
28
|
spec.require_paths = ['lib']
|
29
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
27
30
|
end
|
data/sig/mmh3.rbs
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Mmh3
|
2
|
+
VERSION: String
|
3
|
+
|
4
|
+
def self?.hash32: (String key, ?seed: Integer seed) -> Integer
|
5
|
+
def self?.hash128: (String key, ?seed: Integer seed, ?x64arch: bool x64arch) -> Integer
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def self?.hash128_x64: (String key, ?Integer seed) -> Integer
|
10
|
+
def self?.hash128_x86: (String key, ?Integer seed) -> Integer
|
11
|
+
def self?.block32: (Array[Integer] kb, Integer bstart, Integer offset) -> Integer
|
12
|
+
def self?.block64: (Array[Integer] kb, Integer bstart, Integer offset) -> Integer
|
13
|
+
def self?.rotl32: (Integer x, Integer r) -> Integer
|
14
|
+
def self?.rotl64: (Integer x, Integer r) -> Integer
|
15
|
+
def self?.scramble32: (Integer k) -> Integer
|
16
|
+
def self?.fmix32: (Integer h) -> Integer
|
17
|
+
def self?.fmix64: (Integer h) -> Integer
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mmh3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A pure Ruby implementation of MurmurHash3
|
14
14
|
email:
|
@@ -17,28 +17,32 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- ".coveralls.yml"
|
20
21
|
- ".github/workflows/build.yml"
|
22
|
+
- ".github/workflows/coverage.yml"
|
21
23
|
- ".gitignore"
|
22
24
|
- ".rspec"
|
25
|
+
- ".rubocop.yml"
|
23
26
|
- CHANGELOG.md
|
24
27
|
- Gemfile
|
25
28
|
- LICENSE.txt
|
26
29
|
- README.md
|
27
30
|
- Rakefile
|
28
|
-
-
|
29
|
-
- bin/setup
|
31
|
+
- Steepfile
|
30
32
|
- lib/mmh3.rb
|
31
33
|
- lib/mmh3/version.rb
|
32
34
|
- mmh3.gemspec
|
35
|
+
- sig/mmh3.rbs
|
33
36
|
homepage: https://github.com/yoshoku/mmh3
|
34
37
|
licenses:
|
35
38
|
- MIT
|
36
39
|
metadata:
|
37
40
|
homepage_uri: https://github.com/yoshoku/mmh3
|
38
41
|
source_code_uri: https://github.com/yoshoku/mmh3
|
39
|
-
changelog_uri: https://github.com/yoshoku/mmh3/blob/
|
42
|
+
changelog_uri: https://github.com/yoshoku/mmh3/blob/main/CHANGELOG.md
|
40
43
|
documentation_uri: https://rubydoc.info/gems/mmh3
|
41
|
-
|
44
|
+
rubygems_mfa_required: 'true'
|
45
|
+
post_install_message:
|
42
46
|
rdoc_options: []
|
43
47
|
require_paths:
|
44
48
|
- lib
|
@@ -53,8 +57,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
57
|
- !ruby/object:Gem::Version
|
54
58
|
version: '0'
|
55
59
|
requirements: []
|
56
|
-
rubygems_version: 3.
|
57
|
-
signing_key:
|
60
|
+
rubygems_version: 3.2.33
|
61
|
+
signing_key:
|
58
62
|
specification_version: 4
|
59
63
|
summary: A pure Ruby implementation of MurmurHash3
|
60
64
|
test_files: []
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "mmh3"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|