【问题标题】:Compute the first 64 bits of the md5 digest as an integer in PHP?将 md5 摘要的前 64 位计算为 PHP 中的整数?
【发布时间】:2012-01-17 00:10:07
【问题描述】:

这个问题类似于: 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);
    }
}

【问题讨论】:

    标签: php md5


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

      有一些扩展提供了任意大小的整数类型,但如果你想执行按位运算,这些扩展会很笨重。

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

      【讨论】:

      • 64 位 PHP 确实有 64 位有符号整数,但没有 64 位无符号整数...但是可以计算 64 位字节流
      • @MarkBaker:如果 OP 想要,将 md5 的十六进制输出转换为原始字节是 trivial。唯一的问题是他们没有说出来。
      猜你喜欢
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2012-07-07
      • 2011-12-11
      • 2014-01-11
      • 2018-11-05
      相关资源
      最近更新 更多