代码之家  ›  专栏  ›  技术社区  ›  tigrou

如何使用hashAlgorithm.TransformBlock/TransformFinalBlock?

  •  4
  • tigrou  · 技术社区  · 7 年前

    我想用以下几个步骤计算sha1哈希 TransformBlock() / TransformFinalBlock() 以下内容:

    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 )。上面是更复杂代码的简化版本。

    我完全不清楚的是 输出缓冲区数组 (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);
    
    1 回复  |  直到 7 年前
        1
  •  6
  •   xanatos    7 年前

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

    SHA1 ICryptoTransform SHA1.TransformBlock() null (未登记但有效)。

    HashAlgorithm (这是 )内部 TransformBlock line

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

    input == output