Как можно использовать выходные параметры `HashAlgorithm.TransformBlock`?

Метод HashAlgorithm.TransformBlock принимает аргументы outputBuffer и outputOffset.

Я не могу придумать причину, по которой этот метод должен иметь такие. Как часто копировать хешированные данные где-то, что копия стала неотъемлемой частью этого метода?

Мне очень любопытно видеть хороший вариант использования этих параметров вывода.

Ответы

Ответ 1

Это довольно явно надзор. Я не мог найти источник, чтобы поддержать это, но поскольку он подходит для любого случая использования, который мы могли бы представить (я не могу представить никаких практических случаев использования), экономит разработчики не более одной строки кода. Хуже того, любой разработчик, который (по какой-либо причине) действительно хотел получить копию своего собственного буфера, вероятно, счел бы настолько маловероятным, чтобы TransformBlock сделал бы это для нее, чтобы она, вероятно, сама написала эту строку кода!

outputBuffer используется другими ICryptoTransforms разумными способами (например, в качестве выходного буфера), поэтому он действительно должен содержать - когда не null и не перезаписывать входной буфер - промежуточный дайджест, тем более что он не является иным доступный из класса. (Предоставление промежуточного дайджеста является хорошей идеей всякий раз, когда ввод в алгоритм появляется в нескольких контекстах.)

Мое предположение:

  • Кто-то получил это обратно в 1.1 относительно того, когда должно быть выбрано IOException.
  • В 2.0 кто-то "исправил" эту проблему, но неправильно прочитал спецификацию и скопировал из inputBuffer вместо this.HashValue.
  • Промежуточные дайджесты используются так редко, что никто не жаловался перед 4.0.