Требуется написать консольную программу на C# для генерации сигнатуры указанного файла. Сигнатура генерируется следующим образом: исходный файл делится на блоки заданной длины (кроме последнего блока), для каждого блока вычисляется значение hash-функции SHA256, и вместе с его номером выводится в консоль.
Программа должна уметь обрабатывать файлы, размер которых превышает объем оперативной памяти, и при этом максимально эффективно использовать вычислительные мощности многопроцессорной системы. При работе с потоками допускается использовать только стандартные классы и библиотеки из .Net 3.5 (исключая ThreadPool, BackgroundWorker, TPL). Ожидается реализация с использованием Thread-ов. Путь до входного файла и размер блока задаются в командной строке. В случае возникновения ошибки во время выполнения программы ее текст и StackTrace необходимо вывести в консоль.
Используется 2 байтовых буфера по 32Мб по умолчанию(ByteBuffer.cs), первый - для чтения файла с диска, второй - для обработки прочитанных данных.
В главном потоке программы происходит чтение файла в буфер, когда один буфер заполняется, создается поток для обработки заполненного буфера, главный поток продолжает чтение во второй буфер.
В потоке обработки создаются дополнительные потоки для параллельного подсчета хэша. Количество потоков считающих хэш, зависит от числа ядер процессора. Для последовательного вывода хэшей используется Dictionary<номер_блока, хэш>.
Файл читается(FileByteInputer.cs) блоками заданного размера(64Кб).
Предполагается что максимальный размер обрабатываемого блока ограничен, соответственно меняется размер буфера.