crc32

文字列の crc32 多項式計算を行う

説明

int crc32(string $string)

string の 32 ビット長の CRC (cyclic redundancy checksum) チェックサムを生成します。 これは通常、送信したデータの整合性を検証するために使用します。

警告

PHP の整数型は符号付きで、多くの crc32 チェックサムは 32 ビットシステム上では負の整数になります。 しかし、64 ビット環境では crc32 の結果はすべて正の整数となります。

つまり、符号なしの crc32 チェックサムの文字列表記を 十進形式で取得するには、 sprintf もしくは printf の "%u" フォーマッタを使う必要があります。

チェックサムの十六進表記を取得するには、sprintf あるいは printf の "%x" フォーマッタを使うか、あるいは変換関数 dechex を使います。これらはいずれも、 crc32 の結果を符号なし整数に変換することも行います。

64 ビット環境でも、大きな戻り値に対して負の整数を返すことが検討されました。 しかしその場合、負の整数には余計な オフセット 0xFFFFFFFF######## が付くので、十六進変換が壊れてしまいます。 十六進表現は最もよく使われる形式なので、この処理が壊れないようにしました。 32 ビット環境から 64 ビット環境に移したときに ほぼ 50% の確率で十進形式での比較が失敗してしまいますが、 それよりも十六進表記のほうを優先したのです。

今思えば、この関数が整数値を返すようにしたというのがまずい判断でした。 最初から、md5 のように十六進形式の文字列を直接返すようにしておけばよかったのでしょう。

移植性を考慮した選択肢として、より汎用的な hash を使う方法もあります。 hash("crc32b", $str)str_pad(dechex(crc32($str)), 8, '0', STR_PAD_LEFT) と同じ文字列を返します。

パラメータ

string

データ。

戻り値

string の crc32 チェックサムを整数値で返します。

例1 crc32 チェックサムの表示

この例は printf 関数を用いた変換後のチェックサムの表示方法を示しています。

<?php
$checksum = crc32("The quick brown fox jumped over the lazy dog.");
printf("%u\n", $checksum);
?>

参考

  • hash
  • md5
  • sha1