Last active
September 4, 2020 14:52
-
-
Save oleksmir/1e98226605c5e1374e29b86996df70f4 to your computer and use it in GitHub Desktop.
Golang Coursera
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"sort" | |
"strconv" | |
"strings" | |
"sync" | |
) | |
// сюда писать код | |
var mu sync.Mutex | |
var SingleHash job = func(in, out chan interface{}) { | |
wg := sync.WaitGroup{} | |
for i := range in { | |
wg.Add(1) | |
go func(i interface{}) { | |
str := fmt.Sprintf("%v", i) | |
crc := make(chan string) | |
md := make(chan string) | |
crcMd := make(chan string) | |
go func() { | |
crc <- DataSignerCrc32(str) | |
close(crc) | |
}() | |
go func() { | |
mu.Lock() | |
md <- DataSignerMd5(str) | |
close(md) | |
mu.Unlock() | |
}() | |
go func() { | |
crcMd <- DataSignerCrc32(<-md) | |
close(crcMd) | |
}() | |
hash := <-crc + "~" + <-crcMd | |
out <- hash | |
wg.Done() | |
}(i) | |
} | |
wg.Wait() | |
} | |
var MultiHash job = func(in, out chan interface{}) { | |
wgOuter := sync.WaitGroup{} | |
for i := range in { | |
wgOuter.Add(1) | |
go func(i interface{}){ | |
hash := "" | |
str := fmt.Sprintf("%v", i) | |
parts := make([]string, 6, 6) | |
wgInner := sync.WaitGroup{} | |
for j := 0; j <= 5; j++ { | |
wgInner.Add(1) | |
go func(index int) { | |
parts[index] = DataSignerCrc32(strconv.Itoa(index) + str) | |
wgInner.Done() | |
}(j) | |
} | |
wgInner.Wait() | |
hash += strings.Join(parts, "") | |
out <- hash | |
wgOuter.Done() | |
}(i) | |
} | |
wgOuter.Wait() | |
} | |
var CombineResults job = func(in, out chan interface{}) { | |
var collector []string | |
for i := range in { | |
collector = append(collector, i.(string)) | |
} | |
sort.Strings(collector) | |
out <- strings.Join(collector, "_") | |
} | |
func ExecutePipeline(jobs ...job) { | |
out := make(chan interface{}) | |
lastOut := out | |
if len(jobs) > 1 { | |
lastOut = out | |
for i := 1; i < len(jobs); i++ { | |
lastOut = next(lastOut, jobs[i]) | |
} | |
} | |
jobs[0](nil, out) | |
close(out) | |
<-lastOut | |
} | |
func next(originIn chan interface{}, currentJob job) chan interface{} { | |
in := make(chan interface{}) | |
out := make(chan interface{}) | |
go func() { | |
currentJob(in, out) | |
close(out) | |
}() | |
go func() { | |
for i := range originIn { | |
in <- i | |
} | |
close(in) | |
}() | |
return out | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment