gpt4 book ai didi

php - crc32应该如何存储在MySQL中?

转载 作者:可可西里 更新时间:2023-11-01 07:33:12 25 4
gpt4 key购买 nike

我正在用 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 ,

最佳答案

您可以在 MySQL 中将值存储为 INT UNSIGNED,它占用 4 个字节(即 32 位)。

要将值插入数据库,您必须在 32 位机器上使用 %u 格式的 sprintf():

$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 类型(长符号)。目前,您只能通过使用 pack() 来完成此操作和 unpack() :

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

这个想法是由 mindplay.dk 贡献的

关于php - crc32应该如何存储在MySQL中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13419921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com