関数・クラス解説
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);
参考
ワード検索
※入力キーワードが、関数名・説明文・タグに含まれるものを検索関数名アルファベット別
最終更新一覧
●stristr
大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却
●stripslashes
バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く
●stripos
大文字小文字を区別せずに文字列が最初に現れる位置を取得する
●stripcslashes
addcslashes() でクォートされた文字列をアンクォートする
●strip_tags
文字列から HTML と PHP のタグを除去して返却
●strcspn
指定した文字が最初に現れる位置を調べる
●strcoll
ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する
●strcmp
2つの文字列を比較し同じか(あるいは大小)を判定する
●strchr
strstr() のエイリアス
●strcasecmp
2つの文字列を比較(大文字小文字を区別せず同じとみなす)
カテゴリー一覧
PHP の振る舞いの変更
音声フォーマットの操作
認証サービス
コマンドライン関連
圧縮およびアーカイブ
暗号
データベース関連
日付および時刻関連
ファイルシステム
自然言語および文字エンコーディング
画像処理および作成
メール関連
数学
テキスト以外の MIME 型
プロセス制御
その他の基本モジュール
その他のサービス
検索エンジン用の拡張モジュール
サーバー固有のモジュール
セッション関連
テキスト処理
変数・データ型関連
ウェブサービス
Windows 用のモジュール
XML 操作
GUI用の拡張モジュール