CRC-32
2022年12月2日 (金) 05:21時点におけるAdministrator (トーク | 投稿記録)による版
CRC-32(語源:Cyclic Redundancy Check 32)、チェックサムを算出するアルゴリズムのひとつである。
CRCシリーズは「CRC-1」から「CRC-256」くらいまで大量に存在しているが、このうちCRC-16とCRC-32は「非常に軽い」「結果が16ビット整数や32ビット整数」などの理由で今なお広く使われている。
CRC32と似たようなアルゴリズムとしてはMD5やSHA1などのハッシュ関数があるが、これらの結果は「文字列(より正確にはBigInteger)」となってしまうため、組込などの世界では非常に扱いにくいということもあり、今なおCRC-16やCRC-32が現役で使われている。
C# での実装例
C# での実装例。
using System;
using System.Collections.Generic;
using System.Linq;
class CRC32
{
static readonly uint[] crcTable;
public CRC32
{
Init();
}
void Init()
{
// crc_tableを生成する
var crcTable = new uint[256];
for (uint i = 0; i < 256; i++)
{
uint c = i;
for (int j = 0; j < 8; j++)
{
c = (c & 1) == 0 ? (c >> 1) : (c >> 1) ^ 0xEDB88320;
}
crcTable[i] = c;
}
}
public uint Calc(byte[] data)
{
// dataのCRC32を計算する
uint crc = 0xFFFFFFFF;
foreach (var b in data)
{
crc = (crc << 8) ^ crcTable[b ^ (crc >> 24)];
}
crc = crc ^ 0xFFFFFFFF;
return uint;
}
}