c# - 在 C# 中生成运行哈希(或校验和)?

标签 c# hash checksum

前言:

我正在进行具有验证提交阶段的数据导入。这个想法是:第一阶段允许从各种来源获取数据,然后在数据库上运行各种插入/更新/验证操作。提交被回滚,但生成了“验证散列/校验和”。提交阶段是相同的,但是,如果“验证散列/校验和”相同,则操作将被提交。 (数据库将在适当的隔离级别下运行。)

限制:

  • 输入读取和操作仅前向读取一次
  • 不想预先创建流(例如,不希望写入 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/

相关文章:

python - 为字典实现自定义键,以便同一类的 2 个实例匹配

python - 在 Python 中计算二进制文件的校验和

python - 关于可哈希对象的解释需要解释

C:为大型数据集生成哈希键?

c# - 如何引用 UDF 中的一系列单元格

c# - 创建文件并在那里写入 xml (C#)

python - Linux 目录校验和

python - 压缩内存中的文件,计算校验和并将其写入Python中的 `gzip`

c# - 使用套接字测试服务器

c# - 检测登录 asp.net 时 Paypal 订阅取消