7

PHP で crc32 を作成していて、それを MySQL データベースのフィールドに格納する必要があります。32 ビット マシンと 64 ビット マシンでの結果にどのような懸念があるかを読んだ後、この数値をどのように格納するべきか疑問に思いました。これは、どちらのビットサイズのマシンでも同じ結果を得るために PHP で crc32 を処理する方法です。

<?php
$checksum = crc32("The quick brown fox jumped over the lazy dog.");
// On a 32-bit system it prints -2103228862 instead of
// 2191738434 which is correct and what prints on a 64-bit system. 
// See the php.net manual page on crc32 for more information about
// 32-bit vs 64-bit.
echo "checksum without printf formatting: " . $checksum . "\n";
printf("%u\n", $checksum);
$string = sprintf("%u", $checksum);
echo $string . "\n";
?>

出力 (64 ビット マシンでは):

checksum without printf formatting: 2191738434
2191738434
2191738434

この数値はどのように MySQL に保存されますか? これまでに思いついたいくつかの選択肢を次に示します。

`hash1` CHAR(10) NOT NULL ,
`hash2` varchar(32) NOT NULL,
`hash3` int unsigned NOT NULL,

私は一緒に行くべきだと思われます:

`hash4` BIGINT UNSIGNED NOT NULL ,
4

1 に答える 1

6

INT UNSIGNED4バイト(つまり32ビット)を占めるMySQLに値を格納できます。

データベースに値を挿入するには、32ビットマシンsprintf()でフォーマットを使用する必要があります。%u

$hash = crc32("The quick brown fox jumped over the lazy dog.");

$stmt = $db->prepare('INSERT INTO mytable VALUES (:hash)');
$stmt->execute(array(
    ':hash' => sprintf('%u', $hash),
));

アップデート

また、32ビットプラットフォームと64ビットプラットフォームの両方で、常にint32タイプ(signed long)を使用していることを確認することもできます。pack()現在、これはandを使用することによってのみ達成できますunpack()

echo current(unpack('l', pack('l', $hash)));
// returns -2103228862 on both 32-bit and 64-bit platforms

このアイデアはmindplay.dkによって提供されました

于 2012-11-16T16:12:45.217 に答える