関数・クラス解説

crc32

version:PHP 4 >= 4.0.1, PHP 5, PHP 7 (公式)

指定した文字列の32ビット長CRCチェックサムを生成する

フォーマット

int : crc32 ( string $str )

パラメータ

string $str (必須)
文字データ

返り値 int
str の crc32 チェックサムを整数値で返却する

解説

crc32は、32ビット長のCRC(cyclic redundancy checksum) チェックサムを生成します。チェックサムは送信されたデータが正しいかを検証するために利用されます。

注意
PHP の整数型は符号付きで、多くの crc32 チェックサムは 32 ビット環境上では負の整数、64 ビット環境ではすべて正の整数となります。
このことから、符号なしの crc32() チェックサムの文字列表記を10進数で取得するには、sprintf() もしくは printf() の "%u" フォーマッタを使う必要があります。
16進数表記を得るには、"%x" フォーマッタか、変換関数 dechex() を使いましょう。詳細については公式サイトをご確認ください。

記述サンプル

//PHP 7.4.6で実行
//文字列を指定
$string = 'abcdefg ABCDEFG あいうえおかきくけこ';

//実行
$checksum = crc32($string);

//10進数で取得する場合、"%u" フォーマッタを使う必要あり
printf("%u", $checksum);

//結果 
1325494272

参考リンク

hash ハッシュ値 (メッセージダイジェスト) を生成する
md5 指定した文字列のMD5ハッシュ値を計算する
sha1 文字列のsha1 ハッシュ値を返す

タグ

チェックサム CRC 32 String 文字列


公式リファレンス

書式

crc32 ( string $str ) : int

説明

str の 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) と同じ文字列を返します。

パラメータ

str
データ。

返値

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

注意

警告 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) と同じ文字列を返します。

サンプル

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

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

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

参考

  • hash() - ハッシュ値 (メッセージダイジェスト) を生成する
  • md5() - 文字列のmd5ハッシュ値を計算する
  • sha1() - 文字列の sha1 ハッシュを計算する
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール