将以 10 为基数转换为以 62 为基数 (a-zA-Z0-9)

我有一个以10为基数的数字。有没有办法把它翻译成62进制?

例:

echo convert(12324324);
// returns Yg3 (fantasy example here)

PHP 的 base_convert() 可以转换为以 36 为基数。


答案 1

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";
}

答案 2

一个更简单(可能更快)的实现,不使用也不使用:powlog

function base62($num) {
  $index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $res = '';
  do {
    $res = $index[$num % 62] . $res;
    $num = intval($num / 62);
  } while ($num);
  return $res;
}

推荐