gpt4 book ai didi

c# - 如何使用HashAlgorithm.TransformBlock/TransformFinalBlock?

转载 作者:太空狗 更新时间:2023-10-30 00:48:02 28 4
gpt4 key购买 nike

我想使用 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说:

Computes the hash value for the specified region of the input byte array and copies the specified region of the input byte array to the specified region of the output byte array

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

这个有典型的用法吗?

同样,TransformFinalBlock() 似乎也将输入数组复制到输出数组。 AFAIKm 这是方法返回的内容:

byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);

最佳答案

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

Calling the TransformBlock method with different input and output arrays results in an IOException.

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

offset += sha.TransformBlock(input, offset, size, input, offset);

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

请注意,在 HashAlgorithm(即实现 ICryptoTransformSHA1 的基类)中,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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com