Quantcast
Channel: How can I have a 64-bit integer in PHP? - Stack Overflow
Viewing all articles
Browse latest Browse all 6

Answer by Josh Curren for How can I have a 64-bit integer in PHP?

$
0
0

PHP int size is platform-dependent. There is a function called unpack() which essentially allows to convert different types of data from binary strings to PHP variables. It seems to be the only way to store as 64 bit is to store it as a string.

I found the following code at:http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/

/// portably build 64bit id from 32bit hi and lo partsfunction _Make64 ( $hi, $lo ){        // on x64, we can just use int        if ( ((int)4294967296)!=0 )            return (((int)$hi)<<32) + ((int)$lo);        // workaround signed/unsigned braindamage on x32        $hi = sprintf ( "%u", $hi );        $lo = sprintf ( "%u", $lo );        // use GMP or bcmath if possible        if ( function_exists("gmp_mul") )            return gmp_strval ( gmp_add ( gmp_mul ( $hi, "4294967296" ), $lo ) );        if ( function_exists("bcmul") )            return bcadd ( bcmul ( $hi, "4294967296" ), $lo );        // compute everything manually        $a = substr ( $hi, 0, -5 );        $b = substr ( $hi, -5 );        $ac = $a*42949; // hope that float precision is enough        $bd = $b*67296;        $adbc = $a*67296+$b*42949;        $r4 = substr ( $bd, -5 ) ++ substr ( $lo, -5 );        $r3 = substr ( $bd, 0, -5 ) + substr ( $adbc, -5 ) + substr ( $lo, 0, -5 );        $r2 = substr ( $adbc, 0, -5 ) + substr ( $ac, -5 );        $r1 = substr ( $ac, 0, -5 );        while ( $r4>100000 ) { $r4-=100000; $r3++; }        while ( $r3>100000 ) { $r3-=100000; $r2++; }        while ( $r2>100000 ) { $r2-=100000; $r1++; }        $r = sprintf ( "%d%05d%05d%05d", $r1, $r2, $r3, $r4 );        $l = strlen($r);        $i = 0;        while ( $r[$i]=="0"&& $i<$l-1 )            $i++;        return substr ( $r, $i );             }    list(,$a) = unpack ( "N", "\xff\xff\xff\xff" );    list(,$b) = unpack ( "N", "\xff\xff\xff\xff" );    $q = _Make64($a,$b);    var_dump($q);

Viewing all articles
Browse latest Browse all 6

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>