为什么我从我的函数中得到这个输出?
echo $var = hash_hmac('ripemd160', 'http://www.weburlhere.org', 0, 0);
echo "rn";
echo $converted = base_convert($var, 16, 2);
echo "rn";
输出:
407a9d8868a678e12d9fc0264f9ae11e8761b557
0000000000000000000000000000000000000000000000000000000000000000
而base_convert($var, 16, 10)
输出
1421821959848150668406846884086820088622688484226
正确。
另外,作为一个附带问题(为此加分!我假设 ripemd160 为每个输入前像提供了一个唯一的标识符。我正在尝试制作一个 url 缩短服务,将 URL 从任意长度缩短到其哈希摘要(我假设使用 base64_encode($converted)
将二进制转换为 base64 会进一步缩短 URL)。这是正确的吗,这是一个好主意吗?
base_convert上的PHP文档说
由于属性的原因,base_convert() 可能会在大数上失去精度与内部使用的"双"或"浮点"类型有关。请参阅的手册中的浮点数部分更具体信息和限制。
因此,您不能依靠此函数来转换大量数字。但是,手动编写一个函数以从基数 16 转换为基数 2 非常容易。
function hex2bin($hex) {
$table = array('0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111',
'1000', '1001', 'a' => '1010', 'b' => '1011',
'c' => '1100', 'd' => '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');
我假设将二进制转换为 base64base64_encode($converted)将进一步缩短URL)。这是正确,这是个好主意吗
是的,它更短。它比二进制短 32 倍,比基数短 16 倍 4 倍。但是,ripemd160 不保证为每个链接提供唯一标识符。仍然有一些碰撞(我什至不知道它会有多罕见)。
根据 PHP 手册,base_convert()
仅限于 double
或float
32 位精度。您可以使用gmp
库来处理任意长度的数字。
同样来自 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 );
}