Вычислить первые 64 бита дайджеста md5 как целое число в PHP? - PullRequest
1 голос
/ 17 января 2012

Эта проблема похожа на: Как получить 64-битный целочисленный хэш из строки в 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 ]

1 голос
/ 19 августа 2013

Это возможно при использовании bcmath плюс некоторые расширения из комментария в принятом ответе здесь: Использование битовых операций над 64-битными целыми числами в 32-битных системах (без расширения 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;
}
1 голос
/ 17 января 2012

Вы не можете сделать это в базовом PHP, потому что PHP не имеет 64-битного целочисленного типа (echo PHP_INT_SIZE для подтверждения). может иметь 64-разрядное целое число со знаком, если вы работаете в стеке x64, но нет гарантии.

Существуют расширения, которые предоставляют целочисленные типы произвольного размера, но они будут громоздкими, если вы хотите выполнить побитовую арифметику.

Чего ты пытаешься достичь? Конечно, есть другой способ достичь своей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...