【问题标题】:How to compute CRC (checksum) for array of struct?如何计算结构数组的 CRC(校验和)?
【发布时间】:2011-11-17 14:34:55
【问题描述】:

我有一个内部有 2 个字节的结构。如何计算此类结构数组的校验和(例如 MD5 哈希)?

public struct MyStruct
{
    public byte Byte1;
    public byte Byte2;
}

public class MyClass
{
    public static byte[] ComputeChecksum(MyStruct[] myStructs)
    {
        // TODO: calculation.
    }
}

【问题讨论】:

  • 你试过什么? 看起来您应该能够简单地遍历数组,将任何选择的哈希算法应用于两个字段。顺便说一句:公开公共字段通常不好,而在结构上具有可变(可变)字段通常不好...
  • 另一边:CRCchecksumMD5不是一回事。
  • 我只是想将我的结构数组作为字节数组放入 MD5 计算方法,它只接受 byte[] 和 MemoryStream。
  • 好吧,忘记 CRC 和 MD5。如何将结构数组视为原始字节数组?

标签: c# arrays struct md5 checksum


【解决方案1】:

那么您想要 STRONG 消化还是只是快速的错误检查/一致查找值?

MD5/SHA 是相当密集的操作 - 它们是围绕数百字节的倍数的块结构构建的。

fletcher 和 CRC32 非常高效,并且在生成随机数方面做得很好。他们不擅长的是随机位位置。例如,你不会想要一个 fletcher 而不是只看高位或低位 8 位(因为差异太小)..

要么找到一个开源库,要么点击维基百科了解各种算法。我倾向于使用类似的东西:

  u32 hash_mystruct(mystruct[] data, u32 count) {
      return hash((u8*)data, sizeof(mystruct) * count);
  }
  u32 hash(u8* data, u32 size) {    
    u32 hash = 19;
    for (u32 i = 0; i < size; i++) {
      u8 c = *data++;
      if (c != 0) { // usually when doing on strings this wouldn't be needed
        hash *= c;
      }
      hash += 7;
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2017-12-08
    • 2017-09-24
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2014-05-11
    • 2015-06-29
    相关资源
    最近更新 更多