mmh3 0.2.0 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f75743b47a08fe6ab088a1176cad6746e95dc740715fcd1249d63ab66d9b5a9
4
- data.tar.gz: 53b77cea35c4b49828e338af56ed37bfa714c467643408208d9cd9fbd7d7a104
3
+ metadata.gz: 9b3781157663073fc2ddf9f5af0f58f28e4ef31af58cbc5ac081327b9aba327e
4
+ data.tar.gz: bb4cdba03cab5d309509947f917f884392a23d386a1f072a7322d2ee250dc91f
5
5
  SHA512:
6
- metadata.gz: 26e434a6c91c6d84136c7aba6afb729beb2423ebc5e1db647569680c96ca78ab2a8f825fd639bafa8cc2a06f717e958a924ec8d459f58c41b5eb0cf70d4f3259
7
- data.tar.gz: 1d627f4d5f6aceb7f38db402a1fe339e6c06f8b46a5714ffb8deb565ae40773896de3d2946f4fbf8805807fc1d003a1c070d9156531c3778b86eed55d0124cd9
6
+ metadata.gz: c7fa5acfc24334d26726ac8c32f3ebbeb710012056d71ab35fa73a72ef9067e1bdc76c02e1ec7afb8f3d2f7d522fc0289231fe88cc7f622bd12149aad6ce7a42
7
+ data.tar.gz: c2be744d61934671e2c0ad18b842f178daab06f411f3164d77989fa9b9f347db707aff66dc186ff4bd93374b125d8968979429dc91ac7f5c39e704e14222cd96
@@ -1,5 +1,8 @@
1
+ # 0.3.0
2
+ - Add option to hash128 method for generating a 128-bit hash value in x86 architecture.
3
+
1
4
  # 0.2.0
2
- - Add hash128 method for generating a 128-bit hash value in x86 architecture.
5
+ - Add hash128 method for generating a 128-bit hash value in x64 architecture.
3
6
 
4
7
  # 0.1.0
5
8
  - First release.
@@ -45,13 +45,22 @@ module Mmh3
45
45
  end
46
46
  end
47
47
 
48
- # Generate a 128-bit hash value for x64 architecture.
48
+ # Generate a 128-bit hash value.
49
49
  #
50
50
  # @param key [String] Key for hash value.
51
51
  # @param seed [Integer] Seed for hash value.
52
+ # @param x64arch [Boolean] Flag indicating whether to generate hash value for x64 architecture.
52
53
  #
53
54
  # @return [Integer] Returns hash value.
54
- def hash128(key, seed = 0)
55
+ def hash128(key, seed = 0, x64arch = true)
56
+ return hash128_x86(key, seed) if x64arch == false
57
+
58
+ hash128_x64(key, seed)
59
+ end
60
+
61
+ # private
62
+
63
+ def hash128_x64(key, seed = 0)
55
64
  keyb = key.to_s.bytes
56
65
  key_len = keyb.size
57
66
  n_blocks = key_len / 16
@@ -135,7 +144,150 @@ module Mmh3
135
144
  h2 << 64 | h1
136
145
  end
137
146
 
138
- # private
147
+ def hash128_x86(key, seed = 0)
148
+ keyb = key.to_s.bytes
149
+ key_len = keyb.size
150
+ n_blocks = key_len / 16
151
+
152
+ h1 = seed
153
+ h2 = seed
154
+ h3 = seed
155
+ h4 = seed
156
+ c1 = 0x239b961b
157
+ c2 = 0xab0e9789
158
+ c3 = 0x38b34ae5
159
+ c4 = 0xa1e38b93
160
+
161
+ (0...n_blocks * 16).step(16) do |bstart|
162
+ k1 = block32(keyb, bstart, 0)
163
+ k2 = block32(keyb, bstart, 4)
164
+ k3 = block32(keyb, bstart, 8)
165
+ k4 = block32(keyb, bstart, 12)
166
+
167
+ k1 = (k1 * c1) & 0xFFFFFFFF
168
+ k1 = rotl32(k1, 15)
169
+ k1 = (k1 * c2) & 0xFFFFFFFF
170
+ h1 ^= k1
171
+
172
+ h1 = rotl32(h1, 19)
173
+ h1 = (h1 + h2) & 0xFFFFFFFF
174
+ h1 = (h1 * 5 + 0x561ccd1b) & 0xFFFFFFFF
175
+
176
+ k2 = (k2 * c2) & 0xFFFFFFFF
177
+ k2 = rotl32(k2, 16)
178
+ k2 = (k2 * c3) & 0xFFFFFFFF
179
+ h2 ^= k2
180
+
181
+ h2 = rotl32(h2, 17)
182
+ h2 = (h2 + h3) & 0xFFFFFFFF
183
+ h2 = (h2 * 5 + 0x0bcaa747) & 0xFFFFFFFF
184
+
185
+ k3 = (k3 * c3) & 0xFFFFFFFF
186
+ k3 = rotl32(k3, 17)
187
+ k3 = (k3 * c4) & 0xFFFFFFFF
188
+ h3 ^= k3
189
+
190
+ h3 = rotl32(h3, 15)
191
+ h3 = (h3 + h4) & 0xFFFFFFFF
192
+ h3 = (h3 * 5 + 0x96cd1c35) & 0xFFFFFFFF
193
+
194
+ k4 = (k4 * c4) & 0xFFFFFFFF
195
+ k4 = rotl32(k4, 18)
196
+ k4 = (k4 * c1) & 0xFFFFFFFF
197
+ h4 ^= k4
198
+
199
+ h4 = rotl32(h4, 13)
200
+ h4 = (h4 + h1) & 0xFFFFFFFF
201
+ h4 = (h4 * 5 + 0x32ac3b17) & 0xFFFFFFFF
202
+ end
203
+
204
+ tail_id = n_blocks * 16
205
+ tail_sz = key_len & 15
206
+
207
+ k4 = 0
208
+ k4 ^= keyb[tail_id + 14] << 16 if tail_sz >= 15
209
+ k4 ^= keyb[tail_id + 13] << 8 if tail_sz >= 14
210
+ k4 ^= keyb[tail_id + 12] if tail_sz >= 13
211
+
212
+ if tail_sz > 12
213
+ k4 = (k4 * c4) & 0xFFFFFFFF
214
+ k4 = rotl32(k4, 18)
215
+ k4 = (k4 * c1) & 0xFFFFFFFF
216
+ h4 ^= k4
217
+ end
218
+
219
+ k3 = 0
220
+ k3 ^= keyb[tail_id + 11] << 24 if tail_sz >= 12
221
+ k3 ^= keyb[tail_id + 10] << 16 if tail_sz >= 11
222
+ k3 ^= keyb[tail_id + 9] << 8 if tail_sz >= 10
223
+ k3 ^= keyb[tail_id + 8] if tail_sz >= 9
224
+
225
+ if tail_sz > 8
226
+ k3 = (k3 * c3) & 0xFFFFFFFF
227
+ k3 = rotl32(k3, 17)
228
+ k3 = (k3 * c4) & 0xFFFFFFFF
229
+ h3 ^= k3
230
+ end
231
+
232
+ k2 = 0
233
+ k2 ^= keyb[tail_id + 7] << 24 if tail_sz >= 8
234
+ k2 ^= keyb[tail_id + 6] << 16 if tail_sz >= 7
235
+ k2 ^= keyb[tail_id + 5] << 8 if tail_sz >= 6
236
+ k2 ^= keyb[tail_id + 4] if tail_sz >= 5
237
+
238
+ if tail_sz > 4
239
+ k2 = (k2 * c2) & 0xFFFFFFFF
240
+ k2 = rotl32(k2, 16)
241
+ k2 = (k2 * c3) & 0xFFFFFFFF
242
+ h2 ^= k2
243
+ end
244
+
245
+ k1 = 0
246
+ k1 ^= keyb[tail_id + 3] << 24 if tail_sz >= 4
247
+ k1 ^= keyb[tail_id + 2] << 16 if tail_sz >= 3
248
+ k1 ^= keyb[tail_id + 1] << 8 if tail_sz >= 2
249
+ k1 ^= keyb[tail_id] if tail_sz >= 1
250
+
251
+ if tail_sz > 0
252
+ k1 = (k1 * c1) & 0xFFFFFFFF
253
+ k1 = rotl32(k1, 15)
254
+ k1 = (k1 * c2) & 0xFFFFFFFF
255
+ h1 ^= k1
256
+ end
257
+
258
+ h1 ^= key_len
259
+ h2 ^= key_len
260
+ h3 ^= key_len
261
+ h4 ^= key_len
262
+
263
+ h1 = (h1 + h2) & 0xFFFFFFFF
264
+ h1 = (h1 + h3) & 0xFFFFFFFF
265
+ h1 = (h1 + h4) & 0xFFFFFFFF
266
+ h2 = (h1 + h2) & 0xFFFFFFFF
267
+ h3 = (h1 + h3) & 0xFFFFFFFF
268
+ h4 = (h1 + h4) & 0xFFFFFFFF
269
+
270
+ h1 = fmix32(h1)
271
+ h2 = fmix32(h2)
272
+ h3 = fmix32(h3)
273
+ h4 = fmix32(h4)
274
+
275
+ h1 = (h1 + h2) & 0xFFFFFFFF
276
+ h1 = (h1 + h3) & 0xFFFFFFFF
277
+ h1 = (h1 + h4) & 0xFFFFFFFF
278
+ h2 = (h1 + h2) & 0xFFFFFFFF
279
+ h3 = (h1 + h3) & 0xFFFFFFFF
280
+ h4 = (h1 + h4) & 0xFFFFFFFF
281
+
282
+ h4 << 96 | h3 << 64 | h2 << 32 | h1
283
+ end
284
+
285
+ def block32(kb, bstart, offset)
286
+ kb[bstart + offset + 3] << 24 |
287
+ kb[bstart + offset + 2] << 16 |
288
+ kb[bstart + offset + 1] << 8 |
289
+ kb[bstart + offset]
290
+ end
139
291
 
140
292
  def block64(kb, bstart, offset)
141
293
  kb[2 * bstart + (7 + offset)] << 56 |
@@ -178,5 +330,5 @@ module Mmh3
178
330
  h ^ (h >> 33)
179
331
  end
180
332
 
181
- private_class_method :block64, :rotl32, :rotl64, :scramble32, :fmix32, :fmix64
333
+ private_class_method :hash128_x64, :hash128_x86, :block32, :block64, :rotl32, :rotl64, :scramble32, :fmix32, :fmix64
182
334
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Mmh3
4
4
  # Version number of Mmh3 you are using.
5
- VERSION = '0.2.0'
5
+ VERSION = '0.3.0'
6
6
  end
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.metadata['homepage_uri'] = spec.homepage
15
15
  spec.metadata['source_code_uri'] = 'https://github.com/yoshoku/mmh3'
16
16
  spec.metadata['changelog_uri'] = 'https://github.com/yoshoku/mmh3/blob/master/CHANGELOG.md'
17
- spec.metadata['documentation_url'] = 'https://rubydoc.info/gems/mmh3'
17
+ spec.metadata['documentation_uri'] = 'https://rubydoc.info/gems/mmh3'
18
18
 
19
19
  # Specify which files should be added to the gem when it is released.
20
20
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
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: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-18 00:00:00.000000000 Z
11
+ date: 2020-04-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A pure Ruby implementation of MurmurHash3
14
14
  email:
@@ -37,7 +37,7 @@ metadata:
37
37
  homepage_uri: https://github.com/yoshoku/mmh3
38
38
  source_code_uri: https://github.com/yoshoku/mmh3
39
39
  changelog_uri: https://github.com/yoshoku/mmh3/blob/master/CHANGELOG.md
40
- documentation_url: https://rubydoc.info/gems/mmh3
40
+ documentation_uri: https://rubydoc.info/gems/mmh3
41
41
  post_install_message:
42
42
  rdoc_options: []
43
43
  require_paths: