Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php错误地将基数16转换为基数2_Php_Encoding_Hash_Base_Hmac - Fatal编程技术网

php错误地将基数16转换为基数2

php错误地将基数16转换为基数2,php,encoding,hash,base,hmac,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 00000000000000000000000000000000000000000000000

为什么我从函数中得到这个输出

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\u convert($var,16,10)
输出

14218219598481506684068468840868220088622688484226
正确

另外,作为一个附带问题(这有额外的积分!),我假设ripemd160为每个输入前图像提供了一个唯一的标识符。我正在尝试制作一个url缩短服务,将url从任意长度缩短为其哈希摘要(我假设使用
base64\u encode($converted)
将二进制文件转换为base64将进一步缩短url)。这是正确的吗?这是一个好主意吗?

上面的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');
函数hex2bin($hex){
$table=数组('0000','0001','0010','0011',',
'0100', '0101', '0110', '0111',
‘1000’、‘1001’、‘1010’、‘a’=>‘1011’,
‘b’=>‘1100’、‘c’=>‘1101’、‘e’=>‘1110’,
‘f’=>‘1111’;
$bin='';
对于($i=0;$i
我假设用 base64_encode($converted)将进一步缩短URL)。这是吗 没错,这是个好主意吗

是的,它比较短。它比二进制短32倍,比base-16短4倍。但是,ripemd160并不保证为每个链接提供唯一标识符。仍然存在一些冲突(我甚至不知道这种情况会有多罕见)。

上的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');
函数hex2bin($hex){
$table=数组('0000','0001','0010','0011',',
'0100', '0101', '0110', '0111',
‘1000’、‘1001’、‘1010’、‘a’=>‘1011’,
‘b’=>‘1100’、‘c’=>‘1101’、‘e’=>‘1110’,
‘f’=>‘1111’;
$bin='';
对于($i=0;$i
我假设用 base64_encode($converted)将进一步缩短URL)。这是吗 没错,这是个好主意吗


是的,它比较短。它比二进制短32倍,比base-16短4倍。但是,ripemd160并不保证为每个链接提供唯一标识符。仍然存在一些冲突(我甚至不知道这种情况有多罕见)。

根据PHP手册,冲突限制为
double
float
32位精度。您可以使用
gmp
库来处理任意长度的数字

A也可从PHP手册页面中选择:

/* 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 );
}

根据PHP手册,精度限制为
double
float
32位精度。您可以使用
gmp
库来处理任意长度的数字

A也可从PHP手册页面中选择:

/* 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 );
}

为什么要使用
hash\u hmac
。是否有必要从URL派生一个简短且唯一的值(如哈希值)将不会很好地工作。只在某个地方保留一个计数器会更容易,base-36(避免大小写冲突)将其散列以使其尽可能短。我不知道二进制数是怎么来的,但是…我认为base64编码会提供一个较短的URL,所以我必须首先将十六进制转换为二进制,因为
base64_编码
需要二进制输入数据(或者我认为是这样)。@bvpx,Sverri M.Olsen的想法是拥有自动递增的数字(数据库中的ID),并将ID转换为更高的基数(可以是base64),以提供较短的链接,而不是对URL进行散列并将其用作ID。在我的应用程序中,使用散列的目的与本文讨论的主题有点脱节,并且无论如何都不适合在注释框的范围内。为什么要使用
散列\u hmac
。是否有必要从URL派生一个简短且唯一的值(如哈希值)将不会很好地工作。只在某个地方保留一个计数器会更容易,base-36(避免大小写冲突)将其散列以使其尽可能短。我不知道二进制数是怎么来的,但是…我认为base64编码会提供一个较短的URL,所以我必须首先将十六进制转换为二进制,因为
base64_编码
需要二进制输入数据(或者我认为是这样)。@bvpx,Sverri M.Olsen的想法是拥有自动递增的数字(数据库中的ID),并将ID转换为更高的基数(可以是base64),以提供较短的链接,而不是对URL进行哈希并将其用作ID。在我的应用程序中,使用哈希的目的与本文讨论的主题有点脱节,并且无论如何都不适合在注释框的范围内。注意:在这里可能会有所帮助,尤其是函数。不过,将十六进制转换为二进制非常简单,只需几行代码即可完成。注意:此处的可能会有所帮助,尤其是函数。不过,将十六进制转换为二进制非常简单,只需几行代码即可完成。