我想使用 TransformBlock()/TransformFinalBlock() 分几个步骤计算 SHA1 哈希:

byte[] block1 = Encoding.ASCII.GetBytes("This");
byte[] block2 = Encoding.ASCII.GetBytes("is");
byte[] block3 = Encoding.ASCII.GetBytes("Sparta");

SHA1 sha = new SHA1Managed();
sha.TransformBlock(block1, 0, block1.Length, block1, 0);
sha.TransformBlock(block2, 0, block2.Length, block2, 0);
sha.TransformFinalBlock(block3, 0, block3.Length);

byte[] result = sha.Hash;

我知道还有其他方法可以计算 SHA1(例如: HashAlgorithm.ComputeHash()CryptoStream )。上面是更复杂代码的简化版本。

我完全不清楚的是要为 outputBuffer 数组(TransformBlock 方法的第四个参数)传递什么 :
int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount,
                   byte[] outputBuffer, int outputOffset);

MSDN page 说:



如果我不需要那个数组副本怎么办?我应该通过 null 吗? (避免每次都复制输入数组?)

这有典型的用途吗?

同样,似乎 TransformFinalBlock() 也将输入数组复制到输出数组。 AFAIKm 这是该方法返回的内容:
byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);

最佳答案

您链接的页面和示例非常清楚:



甚至这个例子在使用上也很清楚:

offset += sha.TransformBlock(input, offset, size, input, offset);
SHA1 并不真正需要该参数。但它是具有此签名的接口(interface) ICryptoTransform 的实现。所以 SHA1.TransformBlock() 有那个(无用的)参数。请注意,您可以将输出设置为 null(未记录但有效)。

请注意,在 HashAlgorithm (即实现 SHA1ICryptoTransform 的基类)中,在 TransformBlock 中有一个 line 如下:
if ((outputBuffer != null) && ((inputBuffer != outputBuffer) || (inputOffset != outputOffset)))
    Buffer.BlockCopy(inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount);

因此,如果您将其设置为 nullinput == output,则不会复制任何内容。

关于c# - 如何使用 HashAlgorithm.TransformBlock/TransformFinalBlock?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50984183/

10-10 12:42