一尘不染

将以10为底的数字转换为以62为底的数字(a-zA-Z0-9)

php

我有一个以10为底的数字。是否有将其转换为以62为底的数字?

例:

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

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


阅读 351

收藏
2020-05-29

共1个答案

一尘不染

OLD :一个快速而肮脏的解决方案可以是使用如下函数:

function toChars($number) {
   $res = base_convert($number, 10,26);
   $res = strtr($res,'0123456789','qrstuvxwyz');
   return $res;
}

基数转换将您的数字转换为数字为0-9a-p的基数,然后使用快速的char替换摆脱其余的数字。

如您所见,该功能易于逆转。

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";
}
2020-05-29