Разница между PHP и PHP 64-Разрядная
я Хотел бы знать разницу между PHP и PHP 64-Разрядной версии.
Я искал о RealPerson.js
, где был код для PHP и один для PHP 64-Разрядная:
PHP
function rpHash($value) {
$hash = 5381;
$value = strtoupper($value);
for($i = 0; $i < strlen($value); $i++) {
$hash = (($hash << 5) + $hash) + ord(substr($value, $i));
}
return $hash;
}
if (rpHash($_POST['realPerson'].salt) == $_POST['realPersonHash']) {
// Accepted
PHP 64Bit
function rpHash($value) {
$hash = 5381;
$value = strtoupper($value);
for($i = 0; $i < strlen($value); $i++) {
$hash = (leftShift32($hash, 5) + $hash) + ord(substr($value, $i));
}
return $hash;
}
// Perform a 32bit left shift
function leftShift32($number, $steps) {
// convert to binary (string)
$binary = decbin($number);
// left-pad with 0's if necessary
$binary = str_pad($binary, 32, "0", STR_PAD_LEFT);
// left shift manually
$binary = $binary.str_repeat("0", $steps);
// get the last 32 bits
$binary = substr($binary, strlen($binary) - 32);
// if it's a positive number return it
// otherwise return the 2's complement
return ($binary{0} == "0" ? bindec($binary) :
-(pow(2, 31) - bindec(substr($binary, 1))));
}
if (rpHash($_POST['realPerson'].salt) == $_POST['realPersonHash']) {
// Accepted
1 answers
В Принципе, то, не имея тщательно абстрактных числовых форматов, когда были разработаны, функций PHP не имеет возможности цифрами, в каждой версии.
Таким образом, в некоторых ситуациях необходимо использовать собственные функции на месте, из собственного поведения, равняться на два.
В коде в вопросе, в частности, в этой части:
$hash << 5
Это работает, таким образом, смещая значение 5 бит влево:
11000000 00001000 00000011 00000000
<< 5 =
00000001 00000000 01100000 00000000
, Если это было в 64-бит, будет происходить так:
00000000 00000000 00000000 00000000 11000000 00001000 00000011 00000000
<< 5 =
00000000 00000000 00000000 00011000 00000001 00000000 01100000 00000000
^
isto aqui não aconteceria em 32
bits, o valor seria truncado, o
que geraria resultados diferentes
nas duas arquiteturas.
Таким образом, необходимо было переписать функциональность оператору <<
, что функция leftShift32($number, $steps)
.
", кстати, был переделан так, среди "странных", так как вместо операции бит, использует различные преобразования и операции со строками.
Лучше было бы сделать версию только что работал, а в 2 случаях, и с помощью математики, наиболее подходящий, зависит только от пользователя оценивать, какой из них использовать, в какой ситуация.