巡回冗長検査(CRC)とは
ウィキペディアによると
巡回冗長検査(じゅんかいじょうちょうけんさ、英: Cyclic Redundancy Check, CRC)は、誤り検出符号の一種で、主にデータ転送などに伴う偶発的な誤りの検出によく使われている。送信側は定められた生成多項式で除算した余りを検査データとして付加して送信し、受信側で同じ生成多項式を使用してデータを除算し、その余りを比較照合することによって受信データの誤り・破損を検出する。
巡回冗長検査は唯一の標準規格があるわけではなく、例えば CRC-12 では3種類の多項式が使われている。また、CRC-16 にはよく使われているものが8種類、CRC-32 は3種類存在する。
よく使われるCRC-32多項式は、IEEE勧告のものも V.42、イーサネット、FDDI、ZIP、PNG などで使われているものも、ハミング符号の生成多項式を使っている。これは、誤り検出性能がよいためである。ただし、iSCSIで使っている Castagnoli CRC-32C の方がさらに優れている。
送信者側と受信者側でデータに対して割り算をしてその余が一致するかを確認するんですね。面白い。
いろんな種類のいろんなアルゴリズムが存在しているようですが、CRC-32がよく使われるという印象を持ちました。
Erlangの:erlang.crc32/1
やっぱりCRC-32がよく使われるのでしょうか。Erlangに:erlang.crc32/1関数が実装されています。
iex(1)> :erlang.crc32("闘魂")
628560421
iex(2)> :erlang.crc32("闘魂")
628560421
iex(3)> :erlang.crc32("闘魂x")
3355293142
これで気軽にCRC-32の巡回冗長検査できることがわかりました。
ご参考までに