前言:
我正在进行具有验证提交阶段的数据导入。这个想法是:第一阶段允许从各种来源获取数据,然后在数据库上运行各种插入/更新/验证操作。提交被回滚,但生成了“验证散列/校验和”。提交阶段是相同的,但是,如果“验证散列/校验和”相同,则操作将被提交。 (数据库将在适当的隔离级别下运行。)
限制:
- 输入读取和操作仅前向读取一次
- 不想预先创建流(例如,不希望写入 MemoryStream),因为可能有很多数据。 (它可以在我们的服务器/负载上运行,但假装内存有限。)
- 不想“创造我自己的”。 (我知道像 CRC-32 by Damien 这样的可用代码,我可以使用/修改它,但更喜欢“标准”的东西。)
我(认为我)在寻找什么:
一种基于输入 + 操作生成哈希(例如 SHA1 或 MD5?)或校验和(例如 CRC32 但希望更多)的方法。 (输入/操作本身可以散列为更适合校验和生成的值,但能够“写入流”就很好了。)
所以,问题是:
如何在 C# 中生成运行哈希(或校验和)?
此外,虽然可以为运行操作修改 CRC32 实现,但运行 SHAx 或 MD5 哈希又如何呢?
我是否缺少某种可以用作适配器的方便的 Stream 方法?
(欢迎批评,但也请在适用的情况下回答上述问题。另外,我不希望处理线程。;-)
最佳答案
您可以调用HashAlgorithm.TransformBlock多次,然后调用 TransformFinalBlock
将为您提供所有 block 的结果。
将您的输入分块(通过从流中读取 x 个字节)并为每个 block 调用 TransformBlock
。
编辑(来自 msdn 示例):
public static void PrintHashMultiBlock(byte[] input, int size)
{
SHA256Managed sha = new SHA256Managed();
int offset = 0;
while (input.Length - offset >= size)
offset += sha.TransformBlock(input, offset, size, input, offset);
sha.TransformFinalBlock(input, offset, input.Length - offset);
Console.WriteLine("MultiBlock {0:00}: {1}", size, BytesToStr(sha.Hash));
}
抱歉,我没有现成的示例,但对您来说,您基本上是用自己的 block 替换 input
,然后 size
就是数字该 block 中的字节数。您必须自己跟踪偏移量。
关于c# - 在 C# 中生成运行哈希(或校验和)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985282/