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.
@@ -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,11 @@
1
+ module HashComparator
2
+ module Emails
3
+ class Parser
4
+ def self.parse(emails)
5
+ emails.map do |email|
6
+ email.strip.split('@')[1]
7
+ end
8
+ end
9
+ end
10
+ end
11
+ 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
@@ -0,0 +1,3 @@
1
+ module HashComparator
2
+ VERSION = '0.0.2'
3
+ 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: []