테스트 사이트 - 개발 중인 베타 버전입니다

큰숫자 -> 문자열로 압축 -> 다시 해제 함수모음 / base_convert() Base 62

· 6년 전 · 2236

큰숫자를 대소문자를 포함한 62 base로 변환하여 압축함

틀린그림찾기 소스에 적용함..

 

<?php

 

function int2base($n){
    $r = '';
    for ($i = 1; $n >= 0 && $i < 10; $i++) {
        $r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r;
        $n -= pow(26, $i);
    }
    return $r;
}


function base2int($a) {
    $r = 0;
    $l = strlen($a);
    for ($i = 0; $i < $l; $i++) {
        $r += pow(26, $i) * (ord($a[$l - $i - 1]) - 0x40);
    }
    return $r - 1;
}

function base_convert_alt($val,$from_base,$to_base){
    static $gmp;
    static $bc;
    static $gmp62;
    if ($from_base<37) $val=strtoupper($val);
    if ($gmp===null) $gmp=function_exists('gmp_init');
    if ($gmp62===null) $gmp62=version_compare(PHP_VERSION,'5.3.2')>=0;
    if ($gmp && ($gmp62 or ($from_base<37 && $to_base<37)))
    return gmp_strval(gmp_init($val,$from_base),$to_base);
    if ($bc===null) $bc=function_exists('bcscale');
    $range='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    if ($from_base==10)
    $base_10=$val;
    else
    {
    $n=strlen(($val="$val"))-++$ratio;
    if ($bc) for($i=$n;$i>-1;($ratio=bcmul($ratio,$from_base)) && $i--)
    $base_10=bcadd($base_10,bcmul(strpos($range,$val[$i]),$ratio));
    else for($i=$n;$i>-1;($ratio*=$from_base) && $i--)
    $base_10+=strpos($range,$val[$i])*$ratio;
    }
    if ($bc)
    do $result.=$range[bcmod($base_10,$to_base)];
    while(($base_10=bcdiv($base_10,$to_base))>=1);
    else
    do $result.=$range[$base_10%$to_base];
    while(($base_10/=$to_base)>=1);
    return strrev($to_base<37?strtolower($result):$result);
}


function toBase($num, $to_base=62) {
    $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $r = $num  % $to_base ;
    $res = $base[$r];
    $q = floor($num/$to_base);
    while ($q) {
        $r = $q % $to_base;
        $q =floor($q/$to_base);
        $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;
}


function ar_base_convert($num,$from_base=10,$to_base=62){
  $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  if ($to_base>$from_base) {
      $r = $num  % $to_base ;
      $res = $base[$r];
      $q = floor($num/$to_base);
      while ($q) {
        $r = $q % $to_base;
        $q =floor($q/$to_base);
        $res = $base[$r].$res;
      }
  }
  else if ($to_base<$from_base) {
      $limit = strlen($num);
      $res=strpos($base,$num[0]);
      for($i=1;$i<$limit;$i++) {
        $res = $from_base * $res + strpos($base,$num[$i]);
      }

  }
  else if ($to_base==$from_base) {
      $res=$val;
  }
  return $res;
}
 

 

for ($i=1;$i<10;$i++) {
    $num=rand(100000,100000000000);
    $out=int2base($num);
    $num2=base2int($out);
    echo "$num -> $out -> $num2  LEN:".strlen($out);
    echo "<BR>";

    $out = base_convert_alt($num, 10,62);
    $num2 = base_convert_alt($out, 62,10);

    echo "$num -> $out -> $num2 LEN:".strlen($out);
    echo "<BR>";

    $out = toBase($num);
    $num2 = to10($out);

    echo "$num -> $out -> $num2 LEN:".strlen($out);
    echo "<BR>";


    $out = ar_base_convert($num,10,62);
    $num2 = ar_base_convert($out,62,10);

    echo "$num -> $out -> $num2 LEN:".strlen($out);
    echo "<BR>";

    
    echo "<BR>";
}
 

 

?>

 

 

 

67254498163 -> HIRLXFOV -> 67254498163 LEN:8
67254498163 -> 1bpv1gn -> 67254498163 LEN:7
67254498163 -> 1bpv1gn -> 67254498163 LEN:7
67254498163 -> 1bpv1gn -> 67254498163 LEN:7

86492069029 -> JSYPLOQP -> 86492069029 LEN:8
86492069029 -> 1wppUfr -> 86492069029 LEN:7
86492069029 -> 1wppUfr -> 86492069029 LEN:7
86492069029 -> 1wppUfr -> 86492069029 LEN:7

46292800946 -> ESVFLJTC -> 46292800946 LEN:8
46292800946 -> OwTSfM -> 46292800946 LEN:6
46292800946 -> OwTSfM -> 46292800946 LEN:6
46292800946 -> OwTSfM -> 46292800946 LEN:6

74768014582 -> IGZVSMVO -> 74768014582 LEN:8
74768014582 -> 1jBYY74 -> 74768014582 LEN:7
74768014582 -> 1jBYY74 -> 74768014582 LEN:7
74768014582 -> 1jBYY74 -> 74768014582 LEN:7

85146602204 -> JOPJEFCO -> 85146602204 LEN:8
85146602204 -> 1uWmsRC -> 85146602204 LEN:7
85146602204 -> 1uWmsRC -> 85146602204 LEN:7
85146602204 -> 1uWmsRC -> 85146602204 LEN:7

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

게시글 목록

번호 제목
86
83
80
79
78
77
76
75
74
71
63
62
61
60
59
57
55
49
48
47
46
41
40
33
28
24
22
19
12
9