base62编码

Base62编码是由10个数字、26个大写英文字母和26个小写英文字母组成,多用于安全领域。本文将介绍对数字进行Base62编码与解码的方法。

直接上代码,如下:

        /**
         * base62编码与解码key,由10个数字、26个大写英文字母和26个小写英文字母组成
         * @var string
         */
        private $key = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';

        /**
         * base62编码
         * @param string $str
         * @return string
         */
        public function base62_encode($str) {
            $out = '';
            for($t=floor(log10($str)/log10(62)); $t>=0; $t--) {
                $a = floor($str / pow(62, $t));
                $out = $out.substr($this->key, $a, 1);
                $str = $str - ($a * pow(62, $t));
            }
            return $out;
        }

        /**
         * base62解码
         * @param string $str
         * @return string
         */
        public function base62_decode($str) {
            $out = 0;
            $len = strlen($str) - 1;
            for($t=0; $t<=$len; $t++) {
                $out = $out + strpos($this->key, substr($str, $t, 1)) * pow(62, $len - $t);
            }
            return substr(sprintf("%f", $out), 0, -7);
        }

        /**
         * 测试程序
         */
        public function indexAction(){
            header('content-Type:text/html;charset=utf-8');
            $equal = $notequal = 0;
            for($i=0; $i<10000000; $i++){
                $encode = $this -> base62_encode($i);
                $decode = $this -> base62_decode($encode);
                if($decode == $i){
                    $equal++;
                }else{
                    $notequal++;
                    echo "{$i}---{$encode}---{$decode}<br />";
                }
            }
            echo "相等{$equal},不相等{$notequal}<br />";

        }

经过对1千万个数字进行检验测试,页面输出如下:

相等10000000,不相等0

准确率达到100%。

特别注意

Base62编码与解码的key中,必须包含有“+/”这两个字符,如下代码所示:

private $key = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';

若key中不含有“+/”,经过测试,会有出现一个数字不能正常解码,如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维小白

9.5 sed(下)

sed工具 sed '1'd test.txt sed '1,3'd test.txt sed '/oot/'d test.txt sed '1,2s/ot/t...

18560
来自专栏安恒网络空间安全讲武堂

二进制学习系列-栈溢出之2018红帽杯

程序就是让你输名字和职业,然后有一段可以给你修改的选项,是不是觉得每个fgets都限制了个数,所以溢出点在哪里?

17520
来自专栏一“技”之长

一个移动开发者的Mock数据之路 原

    在前端开发中,很大一部分工作都是将后台数据获取到后展示在前端界面上。如果接口是现成的,这个过程还相对容易一些,但是如果接口的开发和前端开发是同时进行的,...

7710
来自专栏用户2442861的专栏

阿里巴巴2014笔试题详解(9月22北京)

第一部分 单选题(前10题,每题2分;后10题,每题3分。选对得满分,选错倒扣1分,不选得0分)

21210
来自专栏一个会写诗的程序员的博客

一致性(连续性)hash算法(Consistent hashing)一致性(连续性)hash算法(Consistent hashing)

Consistent hashing is a scheme that provides hash table functionality in a way t...

14320
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之树的子结构(九度OJ1520)

题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构。 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行一个整数n,m(...

202100
来自专栏灯塔大数据

每周学点大数据 | No.28 表排序

No.28期 表排序 Mr. 王:前面我们讨论了一些基础磁盘算法,现在我们来讨论一些关于磁盘中图算法的问题。 通过对基础磁盘算法的学习,我们可以很容易地想到...

34270
来自专栏机器学习从入门到成神

字符串面试题(三)— 把一个字符串的大写字母放到字符串的后面

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

21210
来自专栏DannyHoo的专栏

iOS开发中为NSNull的分类添加“属性”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details...

16050
来自专栏CDA数据分析师

实用小工具,教你轻松转化Python通用数据格式

已独立成项目在github上面 dataformat, 涉及模块 os, getopt, sys。 1 需求 在进行hadoop测试时,需要造大量数据,例如某个...

20950

扫码关注云+社区

领取腾讯云代金券