-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsigner.go
149 lines (94 loc) · 2.52 KB
/
signer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
import (
"fmt"
"sort"
"strconv"
"strings"
"sync"
)
const TH = 6
var ExecutePipeline = func(jobs ...job) {
wg := &sync.WaitGroup{}
in := make(chan interface{})
for _, job := range jobs {
wg.Add(1)
out := make(chan interface{})
go jobWorker(job, in, out, wg)
in = out
}
wg.Wait()
}
func jobWorker(job job, in, out chan interface{}, wg *sync.WaitGroup) {
defer wg.Done()
defer close(out)
job(in, out)
}
var SingleHash = func(in, out chan interface{}) {
mu := &sync.Mutex{}
wg := &sync.WaitGroup{}
for i := range in {
wg.Add(1)
go singleHashWorker(i, out, wg, mu)
}
wg.Wait()
}
func singleHashWorker(in interface{}, out chan interface{}, wg *sync.WaitGroup, mu *sync.Mutex) {
defer wg.Done()
data := strconv.Itoa(in.(int))
mu.Lock()
md5Data := DataSignerMd5(data)
mu.Unlock()
crc32DataChan := make(chan string)
go crc32Parallel(data, crc32DataChan)
crc32Md5Data := DataSignerCrc32(md5Data)
crc32Data := <-crc32DataChan
fmt.Printf("%s SingleHash data %s\n", data, data)
fmt.Printf("%s SingleHash md5(data) %s\n", data, md5Data)
fmt.Printf("%s SingleHash crc32(md5(data)) %s\n", data, crc32Md5Data)
fmt.Printf("%s SingleHash crc32(data) %s\n", data, crc32Data)
fmt.Printf("%s SingleHash result %s\n", data, crc32Data+"~"+crc32Md5Data)
out <- crc32Data + "~" + crc32Md5Data
}
func crc32Parallel(data string, out chan string) {
out <- DataSignerCrc32(data)
}
var MultiHash = func(in, out chan interface{}) {
wg := &sync.WaitGroup{}
for i := range in {
wg.Add(1)
go multiHashWorker(i.(string), out, wg)
}
wg.Wait()
}
func multiHashWorker(in string, out chan interface{}, wg *sync.WaitGroup) {
defer wg.Done()
mu := &sync.Mutex{}
wgCrc32 := &sync.WaitGroup{}
concatArray := make([]string, TH)
for i := 0; i < TH; i++ {
wgCrc32.Add(1)
data := strconv.Itoa(i) + in
go func(concatArray []string, data string, index int, wg *sync.WaitGroup, mu *sync.Mutex) {
defer wg.Done()
data = DataSignerCrc32(data)
mu.Lock()
concatArray[index] = data
fmt.Printf("%s MultiHash: crc32(th+step1)) %d %s\n", in, index, data)
mu.Unlock()
}(concatArray, data, i, wgCrc32, mu)
}
wgCrc32.Wait()
result := strings.Join(concatArray, "")
fmt.Printf("%s MultiHash result: %s\n", in, result)
out <- result
}
var CombineResults = func(in, out chan interface{}) {
var array []string
for i := range in {
array = append(array, i.(string))
}
sort.Strings(array)
result := strings.Join(array, "_")
fmt.Printf("CombineResults \n%s\n", result)
out <- result
}