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。在我的应用程序中,使用哈希的目的与本文讨论的主题有点脱节,并且无论如何都不适合在注释框的范围内。注意:在这里可能会有所帮助,尤其是函数。不过,将十六进制转换为二进制非常简单,只需几行代码即可完成。注意:此处的可能会有所帮助,尤其是函数。不过,将十六进制转换为二进制非常简单,只需几行代码即可完成。