コピペのスニペ・PHP「HEX62」

整数値で10進数を使っているよりも、16進数を使ったほうが、データバイト数が節約できるが、これをもう少し拡張して、
数字[0-9]
大文字英字[A-Z]
小文字英字[a-z]
という風にすると、62進数ができあがる。
見た目的に暗号化しているようにも見えるので、便利に使える場面が多々あったので、下記にメモしておきます。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/** * 文字数縮小の為に10進数を62進数に変更 **/ class HEX62{ // chara-value function chars(){ return array_merge( range(0,9), range('a','z'), range('A','Z') ); } // num->id function encode($n){ $char = $this->chars(); $cn = count($char); $str = ''; while ($n != 0) { $a1 = (int) ($n / $cn); $a2 = $n - ($a1*$cn); $str = $char[$a2].$str; $n = $a1; } return $str; } // id->num function decode($n){ $char = $this->chars(); $cn = count($char); for ($i=0; $i< $cn; $i++) { $chars[$char[$i]] = $i; } $str = 0; for ($i=0; $i<strlen($n); $i++) { $str += $chars[substr($n, ($i+1)*-1, 1)] * pow($cn, $i); } return $str; } } |
使い方
1 2 3 4 5 6 7 8 9 10 11 |
$hex62 = new HEX62(); $num = 100000; //10進数を62進数に変換 $num2 = $hex62->encode($num); print_r($num2); //62進数を10進数に戻す $num3 = $hex62->decode($num2); print_r($num3); |
注意点
62進数にした文字をファイル名にした場合、ファイル名をソートした際に、10進数と並びが変わってしまうので、順番が重要な場合は注意しよう。