この記事では主にphpのcrc32関数を使用する際に注意すべき問題(そうでないと落とし穴になります)を紹介します。必要な人は参照してください
数日前にテーブル分割プログラムを書きました。使用されるハッシュ アルゴリズムは次のとおりです。
コードをコピーします。コードは次のとおりです:
関数_getHash($username)
{
$hash = crc32($username) % 512;
$hash を返す;
}
関数_getTable($username)
{
$hash = self::_getHash($username);
「user_」を返します。
}
まずローカルの32ビットウィンドウマシン上でデータを生成し、対応するテーブルに挿入します。しかし、プログラムとデータをサーバー (Linux の場合は 64) に転送すると、データが見つからないことがわかりました。調査の結果、サーバー上の crc32 の結果がローカルの結果と異なることが判明しました。 PHPのマニュアルを再度確認したところ、crc32インターフェースがこのマシンに関係していることが分かりました。
PHPマニュアルの説明:
コードをコピーします。コードは次のとおりです:
PHP の整数型は署名されているため、多くの crc32 チェックサムは 32 ビット プラットフォームでは負の整数になりますが、64 ビット インストールではすべての crc32() の結果は正の整数になります。
crc32で返される結果は32ビットマシンではオーバーフローするため、結果が負の数になる可能性があります。 64 ビット マシンではオーバーフローがないため、常に正になります。CRCアルゴリズムは語長のビット数に基づいて計算されます。
crc32関数は、phpの2つの定数参照に従ってPHP_INT_SIZEとPHP_INT_MAXを計算します
これら 2 つの定数の定義:
整数の語長はプラットフォームに依存しますが、通常の最大値は約 20 億 (32 ビット符号付き) です。 PHP は符号なし整数をサポートしていません。整数値の語長は定数 PHP_INT_SIZE で表すことができます。PHP 4.4.0 および PHP 5.0.5 以降では、最大値は定数 PHP_INT_MAX で表すことができます。
次の 32 ビットを出力 PHP_INT_SIZE: 4、PHP_INT_MAX: 2147483647
64 ビット モードでの出力 PHP_INT_SIZE: 8、PHP_INT_MAX: 9223372036854775807