MD5, как и другие хеш-функции, не требует двух проходов.
Для начала:
HashAlgorithm hasher = ..;
hasher.Initialize();
По мере поступления каждого блока данных:
byte[] buffer = ..;
int bytesReceived = ..;
hasher.TransformBlock(buffer, 0, bytesReceived, null, 0);
Чтобы закончить и получить хеш:
hasher.TransformFinalBlock(new byte[0], 0, 0);
byte[] hash = hasher.Hash;
Этот шаблон работает для любого типа, производного от HashAlgorithm
, включая MD5CryptoServiceProvider
и SHA1Managed
.
HashAlgorithm
также определяет метод ComputeHash
, который принимает объект Stream
; однако этот метод будет блокировать поток, пока поток не будет использован. Использование подхода TransformBlock
допускает «асинхронный хеш», который вычисляется по мере поступления данных без использования потока.