C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 如何使用HashAlgorithm.TransformBlock / TransformFinalBlock?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用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,block1.Length,block1,0);
sha.TransformBlock(block2,block2.Length,block2,0);
sha.TransformFinalBlock(block3,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 inputCount);

解决方法

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

甚至在使用上的例子很清楚:

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

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

请注意,在HashAlgorithm(实现ICryptoTransform的SHA1的基类)中,TransformBlock内部有一个line,如:

if ((outputBuffer != null) && ((inputBuffer != outputBuffer) || (inputOffset != outputOffset)))
    Buffer.BlockCopy(inputBuffer,inputOffset,outputBuffer,outputOffset,inputCount);

因此,如果将其设置为null或输入== output,则不会复制任何内容.

大佬总结

以上是大佬教程为你收集整理的c# – 如何使用HashAlgorithm.TransformBlock / TransformFinalBlock?全部内容,希望文章能够帮你解决c# – 如何使用HashAlgorithm.TransformBlock / TransformFinalBlock?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: