isbasov

signer

Jan 21st, 2024
1,171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.88 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "sort"
  6.     "strconv"
  7.     "strings"
  8.     "sync"
  9. )
  10.  
  11. type Item struct {
  12.     Index int
  13.     Part  int
  14.     Val   string
  15. }
  16.  
  17. const numberCount = 7
  18.  
  19. func ExecutePipeline(jobs ...job) {
  20.  
  21.     in := make(chan interface{})
  22.     var wg sync.WaitGroup
  23.     for i := range jobs {
  24.         jobFunc := jobs[i]
  25.         out := make(chan interface{})
  26.         wg.Add(1)
  27.         go func(in, out chan interface{}) {
  28.             defer wg.Done()
  29.             jobFunc(in, out)
  30.             close(out)
  31.         }(in, out)
  32.         in = out
  33.     }
  34.     wg.Wait()
  35. }
  36.  
  37. func SingleHash(in, out chan interface{}) {
  38.     workerIn := make(chan Item)
  39.     workerOut := make(chan Item)
  40.  
  41.     var workerWg sync.WaitGroup
  42.     for i := 0; i < numberCount*2; i++ {
  43.         workerWg.Add(1)
  44.         go func() {
  45.             defer workerWg.Done()
  46.             startWorker(workerIn, workerOut, DataSignerCrc32)
  47.         }()
  48.     }
  49.  
  50.     var wg sync.WaitGroup
  51.     wg.Add(1)
  52.     go func() {
  53.         defer wg.Done()
  54.         result := make(map[int][]string)
  55.         for it := range workerOut {
  56.             parts, ok := result[it.Index]
  57.             if !ok {
  58.                 parts = make([]string, 2)
  59.                 parts[it.Part] = it.Val
  60.                 result[it.Index] = parts
  61.                 continue
  62.             }
  63.             parts[it.Part] = it.Val
  64.             out <- strings.Join(parts, "~")
  65.         }
  66.     }()
  67.  
  68.     var ind int
  69.     for raw := range in {
  70.  
  71.         data := fmt.Sprintf("%v", raw)
  72.  
  73.         md5 := DataSignerMd5(data)
  74.  
  75.         workerIn <- Item{Index: ind, Part: 0, Val: data}
  76.         workerIn <- Item{Index: ind, Part: 1, Val: md5}
  77.         ind++
  78.     }
  79.     close(workerIn)
  80.     workerWg.Wait()
  81.     close(workerOut)
  82.     wg.Wait()
  83. }
  84.  
  85. func MultiHash(in, out chan interface{}) {
  86.  
  87.     workerIn := make(chan Item)
  88.     workerOut := make(chan Item)
  89.     var workerWg sync.WaitGroup
  90.     for i := 0; i < numberCount*6; i++ {
  91.         workerWg.Add(1)
  92.         go func() {
  93.             defer workerWg.Done()
  94.             startWorker(workerIn, workerOut, DataSignerCrc32)
  95.         }()
  96.     }
  97.  
  98.     var wg sync.WaitGroup
  99.     wg.Add(1)
  100.     go func() {
  101.         defer wg.Done()
  102.         result := make(map[int][]Item)
  103.  
  104.         for it := range workerOut {
  105.             parts, ok := result[it.Index]
  106.             if !ok {
  107.                 parts = make([]Item, 0, 6)
  108.             }
  109.             parts = append(parts, it)
  110.             result[it.Index] = parts
  111.  
  112.             if len(parts) == 6 {
  113.                 sort.Slice(parts, func(i, j int) bool { return parts[i].Part < parts[j].Part })
  114.                 sb := strings.Builder{}
  115.                 for _, s := range parts {
  116.                     sb.WriteString(s.Val)
  117.                 }
  118.                 out <- sb.String()
  119.             }
  120.         }
  121.     }()
  122.  
  123.     var ind int
  124.     for raw := range in {
  125.  
  126.         data := fmt.Sprintf("%v", raw)
  127.         for th := 0; th <= 5; th++ {
  128.             workerIn <- Item{Index: ind, Part: th, Val: strconv.Itoa(th) + data}
  129.         }
  130.         ind++
  131.     }
  132.  
  133.     close(workerIn)
  134.     workerWg.Wait()
  135.     close(workerOut)
  136.     wg.Wait()
  137.  
  138. }
  139.  
  140. func CombineResults(in, out chan interface{}) {
  141.     ss := make([]string, 0, 100)
  142.     for raw := range in {
  143.         ss = append(ss, fmt.Sprintf("%v", raw))
  144.     }
  145.     sort.StringSlice(ss).Sort()
  146.     out <- strings.Join(ss, "_")
  147. }
  148.  
  149. func startWorker(in <-chan Item, out chan<- Item, workFunc func(s string) string) {
  150.     for it := range in {
  151.         it.Val = workFunc(it.Val)
  152.         out <- it
  153.     }
  154. }
  155.  
Advertisement
Add Comment
Please, Sign In to add comment