以下のコード サンプルは、私のプロジェクトの 1 つで使用している CRC-CCITT の実装です。
public static unsafe ushort CRC(byte * it, byte * end)
{
unchecked
{
ushort crc = 0xFFFF;
ushort quick = 0;
for (;;)
{
ushort tmp = (ushort)((crc >> 8) ^ (*it));
crc <<= 8;
quick = (ushort)(tmp ^ (tmp >> 4));
crc ^= quick;
quick <<= 5;
crc ^= quick;
quick <<= 7;
crc ^= quick;
if (it == end)
break;
it++;
}
return crc;
}
}
CRC-CCITT は、次の多項式を使用します。
(X^16 + X^12 + X^5 + 1)
Q: 上記の多項式は、一連の加算/乗算操作にすぎません。数学の基本法則では、演算の加算/乗算は交換可能であるなどと述べられているため、式は次のようになります。
SUM(from 1 to 10) == SUM(from 1 to 5) + SUM(from 6 to 10)
真です。
上記のコードを最適化する必要があります。これは、おそらく私のプロジェクトで最も頻繁に呼び出されるものです (少なくとも 120 回/秒)。上記を考慮して、これはCRCチェックサムで実行できますか? Parallel.For(...) を使用してトリックを行うことを検討していますが、それは理にかなっていますか? 誰にも提案はありますか?
アップデート :
実際には接続ごとに 120 回。120 [Hz] などのデータレートで少なくとも 15 の同時着信接続を処理しています。バイト配列はさまざまです - 理論上の最大 = 65k バイトですが、ほとんどの場合、約 1k バイトです。