将以 10 为基数转换为以 62 为基数 (a-zA-Z0-9)
2022-08-30 13:37:14
我有一个以10为基数的数字。有没有办法把它翻译成62进制?
例:
echo convert(12324324);
// returns Yg3 (fantasy example here)
PHP 的 base_convert()
可以转换为以 36 为基数。
我有一个以10为基数的数字。有没有办法把它翻译成62进制?
例:
echo convert(12324324);
// returns Yg3 (fantasy example here)
PHP 的 base_convert()
可以转换为以 36 为基数。
OLD:一个快速而肮脏的解决方案可能是使用这样的函数:
function toChars($number) {
$res = base_convert($number, 10,26);
$res = strtr($res,'0123456789','qrstuvxwyz');
return $res;
}
基数转换将您的数字转换为数字为0-9a-p的基数,然后通过快速字符替换除去剩余的数字。
您可能会观察到,该功能很容易反转。
function toNum($number) {
$res = strtr($number,'qrstuvxwyz','0123456789');
$res = base_convert($number, 26,10);
return $res;
}
顺便说一句,你会用这个函数做什么?
编辑:
根据问题更改和@jnpcl答案,这里有一组函数,可以在不使用pow和log的情况下执行基本转换(它们需要一半的时间来完成测试)。
这些函数仅适用于整数值。
function toBase($num, $b=62) {
$base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$r = $num % $b ;
$res = $base[$r];
$q = floor($num/$b);
while ($q) {
$r = $q % $b;
$q =floor($q/$b);
$res = $base[$r].$res;
}
return $res;
}
function to10( $num, $b=62) {
$base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$limit = strlen($num);
$res=strpos($base,$num[0]);
for($i=1;$i<$limit;$i++) {
$res = $b * $res + strpos($base,$num[$i]);
}
return $res;
}
测试:
for ($i = 0; $i<1000000; $i++) {
$x = toBase($i);
$y = to10($x);
if ($i-$y)
echo "\n$i -> $x -> $y";
}
一个更简单(可能更快)的实现,不使用也不使用:pow
log
function base62($num) {
$index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$res = '';
do {
$res = $index[$num % 62] . $res;
$num = intval($num / 62);
} while ($num);
return $res;
}