Хеш-функция из двух разных языков не дает одинакового результата
У меня есть эта функция на языке сценариев "PAWN":
stock hash(Hash[])
{
new
hStr1 = 1, hStr2 = 0;
for(new i = 0, l = strlen(Hash); i < l; i ++)
{
hStr1 = (hStr1 + Hash[i]) % 65521;
hStr2 = (hStr2 + hStr1) % 65521;
}
return (hStr2 << 16) + hStr1;
}
Это выведет:
printf("%d", hash("Test"));
= 64815521 возвращает его как целое число
Это функция PHP:
function hashEX($Hash)
{
$hStr1 = 1; $hStr2 = 0;
for($i = 0, $l = strlen($Hash); $i < $l; $i ++)
{
$hStr1 = ($hStr1 + $Hash[$i]) % 65521;
$hStr2 = ($hStr2 + $hStr1) % 65521;
}
return ($hStr2 << 16) + $hStr1;
}
Это дает мне:
echo intval(hashEX("Test"));
= 262145
echo hashEX("Test");
= 262145
Кто-нибудь знает, почему это и как это исправить? Чтобы было понятно, я хочу получить то же значение, что и функция PAWN в функции PHP.
1 ответ
Нашел мой ответ:
function hashEX($Hash)
{
$hStr1 = 1; $hStr2 = 0;
for($i = 0, $l = strlen($Hash); $i < $l; $i ++)
{
$hStr1 = ($hStr1 + ord($Hash[$i])) % 65521;
$hStr2 = ($hStr2 + $hStr1) % 65521;
}
return ($hStr2 << 16) + $hStr1;
}