「CRC-32」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) |
||
3行目: | 3行目: | ||
CRCシリーズは「CRC-1」から「CRC-256」くらいまで大量に存在しているが、このうち[[CRC-16]]とCRC-32は「非常に軽い」「結果が16ビット整数や32ビット整数」などの理由で今なお広く使われている。 | CRCシリーズは「CRC-1」から「CRC-256」くらいまで大量に存在しているが、このうち[[CRC-16]]とCRC-32は「非常に軽い」「結果が16ビット整数や32ビット整数」などの理由で今なお広く使われている。 | ||
− | + | CRC32と似たような[[アルゴリズム]]としては[[MD5]]や[[SHA1]]などの[[ハッシュ関数]]があるが、これらの結果は「[[文字列]](より正確には[[BigInteger]])」となってしまうため、[[組込]]などの世界では非常に扱いにくいということもあり、今なおCRC-16やCRC-32が現役で使われている。 | |
== C# での実装例 == | == C# での実装例 == |
2022年12月2日 (金) 05:21時点における版
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;
}
}