php正在将base 16转换为base 2

时间:2013-09-17 06:28:08

标签: php encoding hash base hmac

为什么我从我的函数中获取此输出?

echo $var = hash_hmac('ripemd160', 'http://www.weburlhere.org', 0, 0);
echo "\r\n";
echo $converted = base_convert($var, 16, 2);
echo "\r\n";

输出:

407a9d8868a678e12d9fc0264f9ae11e8761b557
0000000000000000000000000000000000000000000000000000000000000000

base_convert($var, 16, 10)输出

1421821959848150668406846884086820088622688484226正确。

另外,作为一个副问题(奖励积分!)我假设Maturemd160为每个输入的原像提供了一个唯一的标识符。我正在尝试创建一个缩短URL的服务,将URL从任意长度缩短到其哈希摘要(我假设将二进制文件转换为带有base64_encode($converted)的base64将更加缩短URL)。这是正确的,这是一个好主意吗?

2 个答案:

答案 0 :(得分:3)

base_convert上的PHP文档说

  由于属性,

base_convert()可能会丢失大数字的精度   与使用的内部“双”或“浮动”类型有关。请看看   手册中的浮点数部分更具体   信息和限制。

所以,你不能依靠这个函数来转换大数。但是,手动编写函数以从基数16转换为基数2非常容易。

function hex2bin($hex) {
    $table = array('0000', '0001', '0010', '0011', 
                   '0100', '0101', '0110', '0111',
                   '1000', '1001', '1010', 'a' => '1011', 
                   'b' => '1100', 'c' => '1101', 'e' => '1110', 
                   'f' => '1111');
    $bin = '';

    for($i = 0; $i < strlen($hex); $i++) {
        $bin .= $table[strtolower(substr($hex, $i, 1))];
    }

    return $bin;
}
echo hex2bin('407a9d8868a678e12d9fc0264f9ae11e8761b557');
  

我假设将二进制文件转换为base64   base64_encode($ converted)将更短的URL缩短)。这是   是的,这是一个好主意

是的,它更短。它比二进制短32倍,比base-16短4倍。但是,ripemd160不保证为每个链接提供唯一标识符。仍然存在一些碰撞(我甚至不知道它会有多少)。

答案 1 :(得分:2)

根据PHP手册,base_convert()仅限于doublefloat 32位精度。您可以使用gmp库来处理任意长度的数字。

来自PHP手册页的sample code

/* use gmp library to convert base. gmp will convert numbers > 32bit
 * @author lindsay at bitleap dot com
 * @link you can execute this code at http://ideone.com/FT29qo
 */
function gmp_convert($num, $base_a, $base_b)
{
    return gmp_strval ( gmp_init($num, $base_a), $base_b );
}