在PHP中将md5摘要的前64位计算为整数?

时间:2012-01-17 00:10:07

标签: php md5

此问题类似于: How to get a 64 bit integer hash from a string in PHP?

我有这个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);
    }
}

2 个答案:

答案 0 :(得分:1)

你不能在基础PHP中这样做,因为PHP没有64位整数类型(echo PHP_INT_SIZE用于确认)。如果您在x64堆栈上运行,它可能具有64位有符号整数类型,但不能保证。

有些扩展提供了任意大小的整数类型,但是如果你想要执行按位算术,这些扩展将会变得难以处理。

你想要完成什么?当然还有其他一些方法可以实现你的目标。

答案 1 :(得分:1)

这可以使用bcmath加上接受的答案中的评论的一些扩展名:Using bit operations on 64 bits integers in 32 bit systems (no php_gpm extension)。您还需要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;
}