gpt4 book ai didi

php - 将 C 哈希函数转换为 PHP : ezmlm_hash

转载 作者:行者123 更新时间:2023-11-30 16:04:23 24 4
gpt4 key购买 nike

我正在尝试将我的服务器上的 PHP 5.2.x 升级到 5.3.2。问题是,我依赖于 PHP ezmlm_hash() 的损坏实现(该错误概述如下:http://bugs.php.net/bug.php?id=47969)。

我的第一个想法是自己用 PHP 重写原生 PHP 函数(用 C 语言编写)的损坏版本,并在我的代码中使用它,而不是修改 PHP 源代码并从源代码编译 PHP。

这是代码的 C 版本:

PHP_FUNCTION(ezmlm_hash)
{
char *str = NULL;
unsigned int h = 5381L;
int j, str_len;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
&str, &str_len) == FAILURE) {
return;
}

for (j = 0; j < str_len; j++) {
h = (h + (h << 5)) ^ (unsigned long) (unsigned char) tolower(str[j]);
}

h = (h % 53);

RETURN_LONG((int) h);
}

这是我用 PHP 编写的内容:

function ezmlm_hash_mine($email_address){
$h = 5381;
$email_length = strlen($email_address);
for($x=0;$x<$email_length;$x++){
$chr = strtolower($email_address[$x]);
$h = ($h + ($h << 5)) ^ ( ord($chr) );
}

$h = $h % 53;
return $h;
}

我使用的是 64 位机器。这两个函数输出不同的结果:

$email_addresses = array(
'test@example.com',
'mike@example.com',
);

print('<PRE>');

foreach($email_addresses as $email_address){
print(ezmlm_hash($email_address).PHP_EOL);
print(ezmlm_hash_mine($email_address).PHP_EOL.PHP_EOL);
}

输出:

23
-52

15
-21

我知道我可能有一些精度或打字问题,我只是不知道如何解决它。任何帮助将不胜感激!

更新

当我在 32 位机器上运行代码时,它们都输出新的更正值:

12
12

45
45

我认为这与模运算符有关...有人知道 C 模运算符的 PHP 等效项吗? PHP 中的 % 表现不同!

更新2

这对于普通 PHP 来说似乎是不可能的,因为它的浮点运算没有足够的精度,并且 .我必须安装 BCMath 或 GMP。感谢大家的见解。

最佳答案

计算后尝试将此编辑截断为 32 位:

function ezmlm_hash_mine($email_address){
$h = gmp_init(5381);
$d = gmp_setbit(0, 64);
$d32 = gmp_setbit(0, 32);
$email_length = strlen($email_address);

$chr = strtolower($email_address);

for($x=0;$x<$email_length;$x++){
$h = gmp_mod(gmp_xor(gmp_mod(gmp_add($h, gmp_mod(gmp_mul($h, "32"), $d)), $d), ord($chr[$x])), $d32);
}

$h = gmp_mod($h, 53);
return gmp_intval($h);
}

关于php - 将 C 哈希函数转换为 PHP : ezmlm_hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150754/

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