...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package model
15
16 import (
17 "fmt"
18 "strconv"
19 )
20
21
22
23 type Fingerprint uint64
24
25
26 func FingerprintFromString(s string) (Fingerprint, error) {
27 num, err := strconv.ParseUint(s, 16, 64)
28 return Fingerprint(num), err
29 }
30
31
32 func ParseFingerprint(s string) (Fingerprint, error) {
33 num, err := strconv.ParseUint(s, 16, 64)
34 if err != nil {
35 return 0, err
36 }
37 return Fingerprint(num), nil
38 }
39
40 func (f Fingerprint) String() string {
41 return fmt.Sprintf("%016x", uint64(f))
42 }
43
44
45
46 type Fingerprints []Fingerprint
47
48
49 func (f Fingerprints) Len() int {
50 return len(f)
51 }
52
53
54 func (f Fingerprints) Less(i, j int) bool {
55 return f[i] < f[j]
56 }
57
58
59 func (f Fingerprints) Swap(i, j int) {
60 f[i], f[j] = f[j], f[i]
61 }
62
63
64 type FingerprintSet map[Fingerprint]struct{}
65
66
67 func (s FingerprintSet) Equal(o FingerprintSet) bool {
68 if len(s) != len(o) {
69 return false
70 }
71
72 for k := range s {
73 if _, ok := o[k]; !ok {
74 return false
75 }
76 }
77
78 return true
79 }
80
81
82 func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet {
83 myLength, otherLength := len(s), len(o)
84 if myLength == 0 || otherLength == 0 {
85 return FingerprintSet{}
86 }
87
88 subSet := s
89 superSet := o
90
91 if otherLength < myLength {
92 subSet = o
93 superSet = s
94 }
95
96 out := FingerprintSet{}
97
98 for k := range subSet {
99 if _, ok := superSet[k]; ok {
100 out[k] = struct{}{}
101 }
102 }
103
104 return out
105 }
106
View as plain text