Разница между 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
 3
php
Author: Bacco, 2016-10-17

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 случаях, и с помощью математики, наиболее подходящий, зависит только от пользователя оценивать, какой из них использовать, в какой ситуация.

 8
Author: Bacco, 2016-10-17 22:45:10