我想使用 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
(即实现 SHA1
的 ICryptoTransform
的基类)中,在 TransformBlock
中有一个 line 如下:if ((outputBuffer != null) && ((inputBuffer != outputBuffer) || (inputOffset != outputOffset)))
Buffer.BlockCopy(inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount);
因此,如果您将其设置为
null
或 input == output
,则不会复制任何内容。关于c# - 如何使用 HashAlgorithm.TransformBlock/TransformFinalBlock?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50984183/