gpt4 book ai didi

php - C转PHP,字符处理

转载 作者:行者123 更新时间:2023-12-04 07:00:00 25 4
gpt4 key购买 nike

我有一些遗留的 C 代码(作为宏),我不允许以任何方式更改或替换。

此代码(最终)基于源字符串输出一个摘要 (C) 字符串,对字符串中的每个字符的哈希值执行操作。

#define DO_HASH(src, dest) { \
unsigned long hash = 1111; // Seed. You must NOT change this. \
char c, *srcPtr; \
int i; \
unsigned char hashedChar; \
\
srcPtr = src; \
c = *srcPtr++; \
while ( c) { \
hash = ((hash << 5) + hash) + c; \
c = *srcPtr++; \
} \
... // etc.

} //

几年前,我不得不在 PHP 中实现它,作为返回摘要字符串的函数。 PHP 函数必须以相同的方式重现 C 结果。
function php_DO_HASH($srcStr)
{
$hash = 1111; // Seed. You must NOT change this.
$index = 0;
$c = $srcStr[$index];

while ($c) {
$hash = (($hash << 5) + $hash) + ord($c);
$index++;
$c = $srcStr[$index];
}

... // etc.
}

这已经成功地工作了几年。但是,最近几天我的服务器主机升级到新版本的CentOS,但说他们没有更改PHP的版本。从那时起,这两个代码现在生成不同的输出。

任何人都可以就我在 PHP 版本中做错了什么提出建议吗?谢谢。

最佳答案

您遇到了与 this question 相同的 PHP 溢出问题(版本之间的行为不同) .那里接受的答案包含所有血腥细节,包括这个 truncate-to-32-bits 函数,它显然适用于所有版本的 PHP:

function thirtyTwoBitIntval($value)
{
if ($value < -2147483648)
{
return -(-($value) & 0xffffffff);
}
elseif ($value > 2147483647)
{
return ($value & 0xffffffff);
}
return $value;
}

如果您通过该 thirtyTwoBitIntval() 传递您的哈希值每次重新计算时的函数,即:
hash = thirtyTwoBitIntval(($hash << 5) + $hash + ord($c));

那么它应该解决问题。

关于php - C转PHP,字符处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031517/

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