-
Notifications
You must be signed in to change notification settings - Fork 0
/
signer.go
103 lines (78 loc) · 1.85 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
package main
import (
"sort"
"strconv"
"strings"
"sync"
)
const TH = 6
var ExecutePipeline = func(jobs ...job) {
wg := &sync.WaitGroup{}
in := make(chan interface{})
for _, jobTmp := range jobs {
wg.Add(1)
out := make(chan interface{})
go func(in chan interface{}, out chan interface{}, wg *sync.WaitGroup, jobTmp job) {
defer wg.Done()
defer close(out)
jobTmp(in, out)
}(in,out, wg, jobTmp)
in = out
}
wg.Wait()
}
var SingleHash = func(in chan interface{}, out chan interface{}) {
mtx := &sync.Mutex{}
wg := &sync.WaitGroup{}
for i := range in {
wg.Add(1)
go SingleHashFun(i, out, wg, mtx)
}
wg.Wait()
}
func SingleHashFun(in interface{}, out chan interface{}, wg *sync.WaitGroup, mtx *sync.Mutex) {
defer wg.Done()
data := strconv.Itoa(in.(int))
mtx.Lock()
md5 := DataSignerMd5(data)
mtx.Unlock()
crc32 := make(chan string)
go func(data string) {
crc32 <- DataSignerCrc32(data)
}(data)
crc32DataMd5 := DataSignerCrc32(md5)
crc32Data := <-crc32
out <- crc32Data + "~" + crc32DataMd5
}
var MultiHash = func(in chan interface{}, out chan interface{}) {
wg := &sync.WaitGroup{}
for data := range in {
wg.Add(1)
go MultiHashFun(data, out, wg)
}
wg.Wait()
}
func MultiHashFun(in interface{}, out chan interface{}, wg *sync.WaitGroup) {
defer wg.Done()
wgTmp := &sync.WaitGroup{}
result := make([]string, TH)
strIn := in.(string)
for i := 0; i < TH; i++ {
wgTmp.Add(1)
data := strconv.Itoa(i) + strIn
go func(result []string, data string, i int, wg *sync.WaitGroup) {
defer wg.Done()
result[i] = DataSignerCrc32(data)
}(result, data, i, wgTmp)
}
wgTmp.Wait()
out <- strings.Join(result, "")
}
var CombineResults = func(in chan interface{}, out chan interface{}) {
var arr []string
for data := range in {
arr = append(arr, data.(string))
}
sort.Strings(arr)
out <- strings.Join(arr, "_")
}