hash_comparator 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []