我希望使用SHA1 /TransformFinalBlock()在几个步骤中计算一个TransformBlock()哈希:
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页面说:
计算输入字节数组指定区域的哈希值,将输入字节数组的指定区域复制到输出字节数组的指定区域()。
如果我不需要那个阵列副本呢?我应该通过null吗?(为了避免每次复制输入数组?)
这有什么典型的用途吗?
类似地,TransformFinalBlock()似乎也将输入数组复制到输出数组中。AFAIKm --这是方法返回的内容:
byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);发布于 2018-06-22 08:56:49
您所链接的页面和示例非常清楚:
使用不同的输入和输出数组调用TransformBlock方法将产生一个IOException。
甚至这个例子在使用上也是很清楚的:
offset += sha.TransformBlock(input, offset, size, input, offset);SHA1并不真正需要这个参数。但是它是具有此签名的接口ICryptoTransform的实现。所以SHA1.TransformBlock()有那个(无用的)参数。请注意,可以将输出设置为null (无文档但有效)。
请注意,在HashAlgorithm (即实现ICryptoTransform的SHA1的基类)中,TransformBlock中有一个线路,如下所示:
if ((outputBuffer != null) && ((inputBuffer != outputBuffer) || (inputOffset != outputOffset)))
Buffer.BlockCopy(inputBuffer, inputOffset, outputBuffer, outputOffset, inputCount);因此,如果将其设置为null或input == output,则不会复制任何内容。
https://stackoverflow.com/questions/50984183
复制相似问题