2014-11-03 1 views
1

내 웹 호스트는 PHP_INT_MAX가 2147483647 즉 32 비트 환경임을보고합니다. 64 비트 환경에서 현재 작동하는 몇 가지 수학 연산을 변환하려고하므로 32 비트 환경에서도 작동합니다.몇 가지 32 비트 연산을 PHP 32 비트 환경에서 작동하도록 변환

32 비트 환경에서
$id = '76561197996545192'; 
$temp = ''; 
for ($i = 0; $i < 8; $i++) 
{ 
    $temp .= chr($id & 0xFF); 
    $id >>= 8; 
} 
$result= md5('BE' . $temp); 
echo $result; 

상기 수율 de46c6d30bfa6e097fca82f63c2f4f4c하지만 (실제로는 현재 64 비트 환경에서 않음) cd97cc68c1038b485b081ba2aa3ea6fa을 수득한다. 비트 시프트 연산자가 불일치를 일으키는 것 같지만 확실하지 않습니다 (저는 PHP 전문가 나 수학자가 아니며 원래 코드의 작성자가 아닙니다 :)

BCMath는 32 비트 환경에 설치되며 다른 프레임 워크가 설치되어있을 수도 있습니다 (필요한 경우 phpinfo를 확인할 수 있음).

어떻게 수정해야합니까? 가능한가?

// 리누스

편집 : 예, 코드가 이상하게 보이는 알고 있지만, 64 비트 환경에서 의도 한대로 정확히 노력하고 있습니다.

답변

1

비트 연산은 $ id가 문자열이기 때문에 실제로 수행하지 않는 것으로 보입니다. 32 비트 시스템에서는 너무 클 수 있기 때문에 정수가 될 수 없다는 것을 이해합니다. 어쩌면 당신이하려고했던 것은 $ id의 마지막 3 문자를 처리하고 그것을 정수로 만드는 것일까? 이것은 그의 코드가 될 것이다 :

$id = '76561197996545192'; 
$temp = ''; 
for ($i = 0; $i < 8; $i++) { 
    $tnbr = intval(substr($id, -3)); 
    $char = chr($tnbr & 0xFF); // Is the bitwise to make them valid chars? Maybe skip that part? 
    $temp .= $char; 
    $id = substr($id, 0, strlen($id) - 3); 
} 

$result = md5('BE' . $temp); 
echo $result; 

이 나에게 98b0f4cc942bfe4a22dd7877ae3e9f06의 결과를 제공합니다.

나는이 수학적 알고리즘의 목적이 무엇인지 잘 모르겠지만, 어쩌면 내가

행운을 빕니다 :) 필요가 없습니다! /윌

+0

당신이 정확할 수도, 이것을 다시 확인해야합니다. 그러면 문제는 $ id를 실제로 "더 큰"int로 선언하는 것입니다. 실제로 이러한 데이터 유형을 사용할 수는 없습니다. 이를 위해 BCMath를 사용할 수 있습니까? –

관련 문제