mmh3 0.1.0 → 0.2.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: 0a69bb53a4e9f7a3a63711f27669f2172ee3e61000961b453bd428fb0dd5147f
4
- data.tar.gz: 5ec35b7d7b436d01c798cf5478e652066477dbf28f1f5be2e6947ac8535d695c
3
+ metadata.gz: 8f75743b47a08fe6ab088a1176cad6746e95dc740715fcd1249d63ab66d9b5a9
4
+ data.tar.gz: 53b77cea35c4b49828e338af56ed37bfa714c467643408208d9cd9fbd7d7a104
5
5
  SHA512:
6
- metadata.gz: 69bf8ef42fe0e46d7954df35d3fe3f43693fe0f7bfe1ab38ea16f81be69c7a08ebe183fb6d51a7c6b133afeb0b757ea44f5d36bcfb36bd95a6e55492e56cb452
7
- data.tar.gz: d19e0b3fe2f766569a166234d16f2940fa3e15ff28d2609c34cf18acf29387a1d58afa20376ead005e828f70c551fd96e9aee75d65286ecaa4bb7b3bfbcf125a
6
+ metadata.gz: 26e434a6c91c6d84136c7aba6afb729beb2423ebc5e1db647569680c96ca78ab2a8f825fd639bafa8cc2a06f717e958a924ec8d459f58c41b5eb0cf70d4f3259
7
+ data.tar.gz: 1d627f4d5f6aceb7f38db402a1fe339e6c06f8b46a5714ffb8deb565ae40773896de3d2946f4fbf8805807fc1d003a1c070d9156531c3778b86eed55d0124cd9
@@ -0,0 +1,5 @@
1
+ # 0.2.0
2
+ - Add hash128 method for generating a 128-bit hash value in x86 architecture.
3
+
4
+ # 0.1.0
5
+ - First release.
@@ -45,10 +45,117 @@ module Mmh3
45
45
  end
46
46
  end
47
47
 
48
+ # Generate a 128-bit hash value for x64 architecture.
49
+ #
50
+ # @param key [String] Key for hash value.
51
+ # @param seed [Integer] Seed for hash value.
52
+ #
53
+ # @return [Integer] Returns hash value.
54
+ def hash128(key, seed = 0)
55
+ keyb = key.to_s.bytes
56
+ key_len = keyb.size
57
+ n_blocks = key_len / 16
58
+
59
+ h1 = seed
60
+ h2 = seed
61
+ c1 = 0x87c37b91114253d5
62
+ c2 = 0x4cf5ad432745937f
63
+
64
+ (0...n_blocks * 8).step(8) do |bstart|
65
+ k1 = block64(keyb, bstart, 0)
66
+ k2 = block64(keyb, bstart, 8)
67
+
68
+ k1 = (k1 * c1) & 0xFFFFFFFFFFFFFFFF
69
+ k1 = rotl64(k1, 31)
70
+ k1 = (k1 * c2) & 0xFFFFFFFFFFFFFFFF
71
+ h1 ^= k1
72
+
73
+ h1 = rotl64(h1, 27)
74
+ h1 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
75
+ h1 = (h1 * 5 + 0x52dce729) & 0xFFFFFFFFFFFFFFFF
76
+
77
+ k2 = (k2 * c2) & 0xFFFFFFFFFFFFFFFF
78
+ k2 = rotl64(k2, 33)
79
+ k2 = (k2 * c1) & 0xFFFFFFFFFFFFFFFF
80
+ h2 ^= k2
81
+
82
+ h2 = rotl64(h2, 31)
83
+ h2 = (h2 + h1) & 0xFFFFFFFFFFFFFFFF
84
+ h2 = (h2 * 5 + 0x38495ab5) & 0xFFFFFFFFFFFFFFFF
85
+ end
86
+
87
+ tail_id = n_blocks * 16
88
+ tail_sz = key_len & 15
89
+
90
+ k2 = 0
91
+ k2 ^= keyb[tail_id + 14] << 48 if tail_sz >= 15
92
+ k2 ^= keyb[tail_id + 13] << 40 if tail_sz >= 14
93
+ k2 ^= keyb[tail_id + 12] << 32 if tail_sz >= 13
94
+ k2 ^= keyb[tail_id + 11] << 24 if tail_sz >= 12
95
+ k2 ^= keyb[tail_id + 10] << 16 if tail_sz >= 11
96
+ k2 ^= keyb[tail_id + 9] << 8 if tail_sz >= 10
97
+ k2 ^= keyb[tail_id + 8] if tail_sz >= 9
98
+
99
+ if tail_sz > 8
100
+ k2 = (k2 * c2) & 0xFFFFFFFFFFFFFFFF
101
+ k2 = rotl64(k2, 33)
102
+ k2 = (k2 * c1) & 0xFFFFFFFFFFFFFFFF
103
+ h2 ^= k2
104
+ end
105
+
106
+ k1 = 0
107
+ k1 ^= keyb[tail_id + 7] << 56 if tail_sz >= 8
108
+ k1 ^= keyb[tail_id + 6] << 48 if tail_sz >= 7
109
+ k1 ^= keyb[tail_id + 5] << 40 if tail_sz >= 6
110
+ k1 ^= keyb[tail_id + 4] << 32 if tail_sz >= 5
111
+ k1 ^= keyb[tail_id + 3] << 24 if tail_sz >= 4
112
+ k1 ^= keyb[tail_id + 2] << 16 if tail_sz >= 3
113
+ k1 ^= keyb[tail_id + 1] << 8 if tail_sz >= 2
114
+ k1 ^= keyb[tail_id] if tail_sz >= 1
115
+
116
+ if tail_sz > 0
117
+ k1 = (k1 * c1) & 0xFFFFFFFFFFFFFFFF
118
+ k1 = rotl64(k1, 31)
119
+ k1 = (k1 * c2) & 0xFFFFFFFFFFFFFFFF
120
+ h1 ^= k1
121
+ end
122
+
123
+ h1 ^= key_len
124
+ h2 ^= key_len
125
+
126
+ h1 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
127
+ h2 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
128
+
129
+ h1 = fmix64(h1)
130
+ h2 = fmix64(h2)
131
+
132
+ h1 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
133
+ h2 = (h1 + h2) & 0xFFFFFFFFFFFFFFFF
134
+
135
+ h2 << 64 | h1
136
+ end
137
+
138
+ # private
139
+
140
+ def block64(kb, bstart, offset)
141
+ kb[2 * bstart + (7 + offset)] << 56 |
142
+ kb[2 * bstart + (6 + offset)] << 48 |
143
+ kb[2 * bstart + (5 + offset)] << 40 |
144
+ kb[2 * bstart + (4 + offset)] << 32 |
145
+ kb[2 * bstart + (3 + offset)] << 24 |
146
+ kb[2 * bstart + (2 + offset)] << 16 |
147
+ kb[2 * bstart + (1 + offset)] << 8 |
148
+ kb[2 * bstart + offset]
149
+ end
150
+
48
151
  def rotl32(x, r)
49
152
  (x << r | x >> (32 - r)) & 0xFFFFFFFF
50
153
  end
51
154
 
155
+ def rotl64(x, r)
156
+ (x << r | x >> (64 - r)) & 0xFFFFFFFFFFFFFFFF
157
+ end
158
+
52
159
  def scramble32(k)
53
160
  k = (k * 0xcc9e2d51) & 0xFFFFFFFF
54
161
  k = rotl32(k, 15)
@@ -63,5 +170,13 @@ module Mmh3
63
170
  h ^ (h >> 16)
64
171
  end
65
172
 
66
- private_class_method :rotl32, :scramble32, :fmix32
173
+ def fmix64(h)
174
+ h ^= h >> 33
175
+ h = (h * 0xff51afd7ed558ccd) & 0xFFFFFFFFFFFFFFFF
176
+ h ^= h >> 33
177
+ h = (h * 0xc4ceb9fe1a85ec53) & 0xFFFFFFFFFFFFFFFF
178
+ h ^ (h >> 33)
179
+ end
180
+
181
+ private_class_method :block64, :rotl32, :rotl64, :scramble32, :fmix32, :fmix64
67
182
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Mmh3
4
4
  # Version number of Mmh3 you are using.
5
- VERSION = '0.1.0'
5
+ VERSION = '0.2.0'
6
6
  end
@@ -14,6 +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
18
 
18
19
  # Specify which files should be added to the gem when it is released.
19
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.1.0
4
+ version: 0.2.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-02-06 00:00:00.000000000 Z
11
+ date: 2020-04-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A pure Ruby implementation of MurmurHash3
14
14
  email:
@@ -20,6 +20,7 @@ files:
20
20
  - ".github/workflows/build.yml"
21
21
  - ".gitignore"
22
22
  - ".rspec"
23
+ - CHANGELOG.md
23
24
  - Gemfile
24
25
  - LICENSE.txt
25
26
  - README.md
@@ -36,6 +37,7 @@ metadata:
36
37
  homepage_uri: https://github.com/yoshoku/mmh3
37
38
  source_code_uri: https://github.com/yoshoku/mmh3
38
39
  changelog_uri: https://github.com/yoshoku/mmh3/blob/master/CHANGELOG.md
40
+ documentation_url: https://rubydoc.info/gems/mmh3
39
41
  post_install_message:
40
42
  rdoc_options: []
41
43
  require_paths: