此问题类似于:如何在PHP中从字符串中获取64位整数哈希?
我有这个JAVA功能。我希望在PHP中有相同的函数。感谢
/**
* returns the first 64 bits of the md5 digest as a long
*/
public static long get64BitMD5(String text) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(text.getBytes(UTF_8));
byte [] digest = md.digest();
long ret = 0;
for (int i = 0; i < 8; i++)
ret = (ret<<8)|(((long)digest[i])&0xFFl);
return ret;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
这可以使用bcmath加上此处接受答案中注释的一些扩展:在32位系统中对64位整数使用位运算(没有php_gpm扩展)。您还需要bchexdec()
函数:http://www.php.net/manual/en/ref.bc.php#99130
所以,如果你包括可以在http://www.nirvani.net/software/bc_bitwise/bc_bitwise-0.9.0.inc.php.asc,您可以使用以下功能。
function get64BitMD5($stringToHash) {
$hash = md5($stringToHash, true);
$ret = '0';
for ($i = 0; $i < 8; $i++) {
$char = substr($hash, $i, 1);
$ret = bcmul($ret, '256'); // (ret<<8)
$tmp = unpack('c', $char);
$tmp = $tmp[1] & 0xFF;
$ret = bcor($ret, $tmp); // bitwise OR ( | op)
}
if (bccomp($ret, '9223372036854775807') == 1) { // > 0x7FFFFFFFFFFFFFFF
$ret = bcsub($ret, bchexdec('10000000000000000'));
}
return $ret;
}
您不能在基本PHP中执行此操作,因为PHP没有64位整数类型(echo PHP_INT_SIZE
用于确认)。如果您在x64堆栈上运行,它可能具有64位有符号整数类型,但不能保证。
有一些扩展提供了任意大小的整数类型,但如果您想执行逐位运算,这些扩展将很难处理。
你想完成什么?当然还有其他方法可以达到你的目的。