CRC-32

提供: MonoBook
ナビゲーションに移動 検索に移動

CRC-32(語源:Cyclic Redundancy Check 32)、チェックサムを算出するアルゴリズムのひとつである。

ちなみにCRCシリーズは「CRC-1」から「CRC-256」くらいまで大量に存在しているが、このうちCRC-16とCRC-32は「非常に軽い」「結果が16ビット整数や32ビット整数」「バランスが良い」などの理由で今なお広く使われている。

CRC32と似たようなアルゴリズムとしてはMD5SHA1などのハッシュ関数があるが、これらの結果は「文字列(より正確には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;
    }
}