hash_comparator 0.0.2
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 +7 -0
- data/lib/hash_comparator.rb +9 -0
- data/lib/hash_comparator/emails/analyzer.rb +31 -0
- data/lib/hash_comparator/emails/parser.rb +11 -0
- data/lib/hash_comparator/hasher.rb +24 -0
- data/lib/hash_comparator/reverse_matcher.rb +34 -0
- data/lib/hash_comparator/set_comparator.rb +18 -0
- data/lib/hash_comparator/version.rb +3 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d80094bdb97ca8548a489934126643430d81b52d78c32e39f49eb543a8f5094e
|
4
|
+
data.tar.gz: 5edab8fa1f3474079f95f9c7eb62143493262aa79125eb1e37b44ff80149910c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 215206512d43dc07b147f8d930539e557709219727c67d04a85ec738cf7b1832dc911a7d1393164f2eff3b9967d32db1f7a019f1d8e13c99ef87b3b1a6cf10aa
|
7
|
+
data.tar.gz: 629862e4672fb94ab7faabee76f7d72e28b5d299341340969be0fcca5f6a6cd3f134d8e1c096f16cc82b5c53c71746e18f51aefc03b54a92c730dc8cde222c6a
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'hash_comparator/hasher'
|
2
|
+
require 'hash_comparator/version'
|
3
|
+
require 'hash_comparator/set_comparator'
|
4
|
+
require 'hash_comparator/reverse_matcher'
|
5
|
+
require 'hash_comparator/emails/analyzer'
|
6
|
+
require 'hash_comparator/emails/parser'
|
7
|
+
|
8
|
+
module HashComparator
|
9
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hash_comparator/hasher'
|
2
|
+
require 'hash_comparator/set_comparator'
|
3
|
+
require 'hash_comparator/emails/parser'
|
4
|
+
require 'hash_comparator/reverse_matcher'
|
5
|
+
|
6
|
+
module HashComparator
|
7
|
+
module Emails
|
8
|
+
class Analyzer
|
9
|
+
def self.execute(hash_function:, subject_raw_emails:, target_hashed_emails:, remove_username: false)
|
10
|
+
if remove_username
|
11
|
+
subject_raw_emails = Parser.parse(subject_raw_emails)
|
12
|
+
end
|
13
|
+
|
14
|
+
subject_hashed_emails = Hasher.hash(
|
15
|
+
hash_function: hash_function,
|
16
|
+
human_readable_items: subject_raw_emails
|
17
|
+
)
|
18
|
+
hashed_common_emails = SetComparator.calculate_overlap(
|
19
|
+
subject_items: subject_hashed_emails,
|
20
|
+
target_items: target_hashed_emails
|
21
|
+
)
|
22
|
+
|
23
|
+
ReverseMatcher.execute(
|
24
|
+
hash_function: hash_function,
|
25
|
+
hashed_items: hashed_common_emails,
|
26
|
+
human_readable_items: subject_raw_emails
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module HashComparator
|
4
|
+
class Hasher
|
5
|
+
SUPPORTED_HASH_FUNCTIONS = { md5: Digest::MD5 }.freeze
|
6
|
+
|
7
|
+
def self.hash(hash_function:, human_readable_items:)
|
8
|
+
new(hash_function: hash_function, human_readable_items: human_readable_items).hash
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(hash_function:, human_readable_items:)
|
12
|
+
@hash_function = SUPPORTED_HASH_FUNCTIONS[hash_function]
|
13
|
+
@human_readable_items = human_readable_items
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :hash_function, :human_readable_items
|
17
|
+
|
18
|
+
def hash
|
19
|
+
human_readable_items.map do |item|
|
20
|
+
hash_function.hexdigest(item)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'digest'
|
2
|
+
require 'hash_comparator/hasher'
|
3
|
+
|
4
|
+
module HashComparator
|
5
|
+
class ReverseMatcher
|
6
|
+
def self.execute(hash_function:, hashed_items:, human_readable_items:)
|
7
|
+
new(
|
8
|
+
hash_function: hash_function,
|
9
|
+
hashed_items: hashed_items,
|
10
|
+
human_readable_items: human_readable_items
|
11
|
+
).execute
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(hash_function:, hashed_items:, human_readable_items:)
|
15
|
+
@hash_function = hash_function
|
16
|
+
@human_readable_items = human_readable_items
|
17
|
+
@hashed_items = hashed_items
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_accessor :hash_function, :human_readable_items, :hashed_items
|
21
|
+
|
22
|
+
def execute
|
23
|
+
subject_hashed_items = Hasher.hash(
|
24
|
+
hash_function: hash_function,
|
25
|
+
human_readable_items: human_readable_items
|
26
|
+
)
|
27
|
+
matches = human_readable_items.each_with_index.map do |item, i|
|
28
|
+
item if hashed_items.include?(subject_hashed_items[i])
|
29
|
+
end.compact
|
30
|
+
|
31
|
+
matches.uniq.sort
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module HashComparator
|
2
|
+
class SetComparator
|
3
|
+
def self.calculate_overlap(subject_items:, target_items:)
|
4
|
+
new(subject_items: subject_items, target_items: target_items).calculate_overlap
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(subject_items:, target_items:)
|
8
|
+
@subject_items = subject_items
|
9
|
+
@target_items = target_items
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_accessor :subject_items, :target_items
|
13
|
+
|
14
|
+
def calculate_overlap
|
15
|
+
subject_items & target_items
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hash_comparator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tanner Johnson
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-01-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.9.2
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.9.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.10'
|
41
|
+
description: A common example is comparing customer lists between businesses, e.g.,
|
42
|
+
hashed unique email domains for users
|
43
|
+
email: johnsontanner3@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- lib/hash_comparator.rb
|
49
|
+
- lib/hash_comparator/emails/analyzer.rb
|
50
|
+
- lib/hash_comparator/emails/parser.rb
|
51
|
+
- lib/hash_comparator/hasher.rb
|
52
|
+
- lib/hash_comparator/reverse_matcher.rb
|
53
|
+
- lib/hash_comparator/set_comparator.rb
|
54
|
+
- lib/hash_comparator/version.rb
|
55
|
+
homepage: https://rubygems.org/gems/hash_comparator
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubygems_version: 3.1.4
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Compare sets of hashes for various purposes
|
78
|
+
test_files: []
|