@@ -8,6 +8,11 @@ import (
8
8
"strconv"
9
9
)
10
10
11
+ type gadgetIndexer struct {
12
+ sequence types.GadgetId
13
+ addressIndex int
14
+ }
15
+
11
16
func MonteCarloEqi (f1 types.Fingerprint , f2 types.Fingerprint , form url.Values ) (float64 , error ) {
12
17
min , err := strconv .ParseInt (form .Get ("min" ), 0 , 64 )
13
18
if err != nil {
@@ -22,31 +27,59 @@ func MonteCarloEqi(f1 types.Fingerprint, f2 types.Fingerprint, form url.Values)
22
27
return 0 , errors .New ("Could not parse number of trials." )
23
28
}
24
29
25
- offsets := offsetSets (f1 , f2 )
30
+ gis := gadgetIndexers (f1 )
26
31
27
32
sum := 0
28
33
for i := 0 ; i < int (trials ); i ++ {
29
- if monteCarloTrial (offsets , min , max ) {
34
+ if monteCarloTrial (f1 , f2 , gis , min , max ) {
30
35
sum ++
31
36
}
32
37
}
33
38
return float64 (sum ) / float64 (trials ), nil
34
39
}
35
40
36
- func monteCarloTrial (displacements [] map [ types.Offset ] bool , minGadgets , maxGadgets int64 ) bool {
41
+ func monteCarloTrial (f1 , f2 types.Fingerprint , gadgetIndexers [] gadgetIndexer , minGadgets , maxGadgets int64 ) bool {
37
42
numGadgets := minGadgets
38
43
if maxGadgets > minGadgets {
39
44
numGadgets += rand .Int63n (maxGadgets - minGadgets )
40
45
}
41
46
42
- workingOffsetSet := offsetSetCopy (randomGadgetDisplacementSet (displacements ))
47
+ workingOffsetSet := offsetSetCopy (randomGadgetDisplacementSet (f1 , f2 , gadgetIndexers ))
43
48
for i := int64 (1 ); i < numGadgets && len (workingOffsetSet ) > 0 ; i ++ {
44
- gadgetOffsetSet := randomGadgetDisplacementSet (displacements )
49
+ gadgetOffsetSet := randomGadgetDisplacementSet (f1 , f2 , gadgetIndexers )
45
50
offsetSetAndEqual (& workingOffsetSet , & gadgetOffsetSet )
46
51
}
47
52
return len (workingOffsetSet ) > 0
48
53
}
49
54
55
+ func randomGadgetDisplacementSet (f1 , f2 types.Fingerprint , gadgetIndexers []gadgetIndexer ) map [types.Offset ]bool {
56
+ index := rand .Intn (len (gadgetIndexers ))
57
+ return offsetSetByIndex (f1 , f2 , gadgetIndexers [index ])
58
+ }
59
+
60
+ func gadgetIndexers (f types.Fingerprint ) []gadgetIndexer {
61
+ var indexers []gadgetIndexer
62
+ for sequence , addresses := range f {
63
+ for i := range addresses {
64
+ indexers = append (indexers , gadgetIndexer {
65
+ sequence : sequence ,
66
+ addressIndex : i ,
67
+ })
68
+ }
69
+ }
70
+ return indexers
71
+ }
72
+
73
+ func offsetSetByIndex (f1 , f2 types.Fingerprint , gi gadgetIndexer ) map [types.Offset ]bool {
74
+ oldAddress := f1 [gi.sequence ][gi.addressIndex ]
75
+ newAddresses := f2 [gi .sequence ]
76
+ offsets := make ([]types.Offset , len (newAddresses ), len (newAddresses ))
77
+ for i := 0 ; i < len (newAddresses ); i ++ {
78
+ offsets [i ] = types .Offset (newAddresses [i ] - oldAddress )
79
+ }
80
+ return offsetSet (offsets )
81
+ }
82
+
50
83
func offsetSet (values []types.Offset ) map [types.Offset ]bool {
51
84
ret := map [types.Offset ]bool {}
52
85
for i := 0 ; i < len (values ); i ++ {
@@ -69,25 +102,4 @@ func offsetSetCopy(s map[types.Offset]bool) map[types.Offset]bool {
69
102
ret [key ] = value
70
103
}
71
104
return ret
72
- }
73
-
74
- func offsetSets (f1 , f2 types.Fingerprint ) []map [types.Offset ]bool {
75
- ret := make ([]map [types.Offset ]bool , 0 )
76
- for gadget , addresses := range f1 {
77
- for i := 0 ; i < len (addresses ); i ++ {
78
- oldAddress := addresses [i ]
79
- newAddresses := f2 [gadget ]
80
- offsets := make ([]types.Offset , len (newAddresses ), len (newAddresses ))
81
- for i := 0 ; i < len (newAddresses ); i ++ {
82
- offsets [i ] = types .Offset (newAddresses [i ] - oldAddress )
83
- }
84
- ret = append (ret , offsetSet (offsets ))
85
- }
86
- }
87
- return ret
88
- }
89
-
90
- func randomGadgetDisplacementSet (displacements []map [types.Offset ]bool ) map [types.Offset ]bool {
91
- index := rand .Intn (len (displacements ))
92
- return displacements [index ]
93
105
}
0 commit comments