Задача написать аналог unix pipeline, что-то вроде:
grep 127.0.0.1 | awk '{print $2}' | sort | uniq -c | sort -nr
Когда STDOUT одной программы передаётся как STDIN в другую программу
Но в нашем случае эти роли выполняют каналы, которые мы передаём из одной функции в другую.
Само задание по сути состоит из двух частей
- Написание функции ExecutePipeline которая обеспечивает нам конвейерную обработку функций-воркеров, которые что-то делают.
- Написание нескольких функций, которые считают нам какую-то условную хеш-сумму от входных данных
Расчет хеш-суммы реализован следующей цепочкой:
- SingleHash считает значение crc32(data)+"~"+crc32(md5(data)) ( конкатенация двух строк через ~), где data - то что пришло на вход (по сути - числа из первой функции)
- MultiHash считает значение crc32(th+data)) (конкатенация цифры, приведённой к строке и строки), где th=0..5 ( т.е. 6 хешей на каждое входящее значение ), потом берёт конкатенацию результатов в порядке расчета (0..5), где data - то что пришло на вход (и ушло на выход из SingleHash)
- CombineResults получает все результаты, сортирует, объединяет отсортированный результат через _ (символ подчеркивания) в одну строку
- crc32 считается через функцию DataSignerCrc32
- md5 считается через DataSignerMd5
В чем подвох:
- DataSignerMd5 может одновременно вызываться только 1 раз, считается 10 мс. Если одновременно запустится несколько - будет перегрев на 1 сек
- DataSignerCrc32, считается 1 сек
- На все расчеты у нас 3 сек.
- Если делать в лоб, линейно - для 7 элементов это займёт почти 57 секунд, следовательно надо это как-то распараллелить