- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 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);
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
(即实现 ICryptoTransform
的 SHA1
的基类)中,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/
我的情况是我有一个 BufferBlock接收Stream来自外部来源,比如说文件系统或某些 FTP 服务器。这些文件Stream s 将进入另一个块并进行处理。 唯一的问题是其中一些文件被压缩了,我
我正试图围绕 TPL 数据流 block 中的“完成”进行思考。特别是,TransformBlock 似乎从未完成。为什么? 示例程序 我的代码计算从 1 到 1000 的所有整数的平方。为此我使用了
我有一个需要并行迭代的对象列表。这是我需要做的: foreach (var r in results) { r.SomeList = await apiHelper.Get(r.Id); }
我正在使用 TransformBlock来自 TPL 数据流库,我已经意识到在转换过程中抛出异常时,我在“接收”方法中得到了一个通用异常,但没有提到原始异常。 在这段代码中: Func> transf
如果我有多个数据源(比如来自数据库),然后执行一些 CPU 密集型工作,我如何使用 TPL DataFlow 来表示它? 我注意到 TransformBlock 采用一个输入源,但输入来自多个源,我想
我有一个场景,我将不得不转换大量对象并将它们分配给一些父容器对象。 我在这些项目上使用了一个 id 以确定它们属于哪个父对象,因此我决定创建一个字典来组织每个父对象及其子对象。 我的问题是关于 Tra
我正在尝试计算整个目录的哈希值,以便稍后监控更改。这相对容易。但是,如果有大文件,计算会花费太多时间,所以我最终使用了一些多线程。 由于 I/O 瓶颈,我应该用一个线程读取一个文件,但我可以通过同时调
我想使用 TransformBlock()/TransformFinalBlock() 分几步计算 SHA1 哈希: byte[] block1 = Encoding.ASCII.GetBytes("
方法 HashAlgorithm.TransformBlock 接受参数 outputBuffer和 outputOffset . 我想不出这个方法有这些的原因。将散列数据复制到某个地方以至于该副本成
我正在学习 .net 中的密码学,为什么方法 1 有效,而方法 2 引发参数异常。请参阅Symmetric Algorithm exception完整代码 1- ICryptoTransform.Tr
我正在关注这个 MSDN Walkthrough - Walkthrough: Creating a Dataflow Pipeline 。我创建了一个 TransformBlock并通过执行 Pos
我已经使用 TPL Dataflow 构建了两条管道: TransformBlock => TransformBlock => BatchBlock => .... TransformBlock =>
我正在使用 TPL 数据流创建输入元素的 bufferBlock,这些元素由输出到输出 bufferBlock 的 TransformBlock 处理 inputQueue = new BufferB
我对异步处理和 TPL 数据流试验还比较陌生。我的场景:我有一个持续提供输入的 block ,对输入异步执行一个函数,然后返回结果。 (然后将结果传递给保存到数据库的另一个 block 。)该函数可能
我正在使用 TPL 数据流 block 来实现基于数据包的网络协议(protocol)。这个协议(protocol)是固定的,我不能改变。大部分都是小包,但包很多。 我有一个连接到服务器并读取原始数据
HashAlgorithm.TransformBlock() 具有 outputBuffer 参数,该参数记录为 用于计算哈希码的输入数组部分的副本。 这听起来像是我的数据将被读取,用于更改哈希机制状
我是一名优秀的程序员,十分优秀!