以前写过16进制和64进制的转换函数,今天做下载页的短连接,突然想到可以吧id转换为64进制,让地址看起来更短,下面是代码,分享给大家。性能测试,1000次计算互转计算,4位64进制数(aaaa:2663050),用时100毫秒左右,平均一次转换用时50微秒左右。
<?php
class jinzhi {
    const KeyCode = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
   
    /**
     * 将64进制的数字字符串转为10进制的数字字符串
     * @param $m string 64进制的数字字符串
     * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
     * @return string
     * @author 野马
     */
    public function hex64to10($m, $len = 0) {
        $m = (string)$m;
        $hex2 = '';
        $Code = self::KeyCode;
        for($i = 0, $l = strlen($Code); $i < $l; $i++) {
            $KeyCode[] = $Code[$i];
        }
        $KeyCode = array_flip($KeyCode);
       
        for($i = 0, $l = strlen($m); $i < $l; $i++) {
            $one = $m[$i];
            $hex2 .= str_pad(decbin($KeyCode[$one]), 6, '0', STR_PAD_LEFT);
        }
        $return = bindec($hex2);
       
        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, '0', STR_PAD_LEFT);
            }
        }
        return $return;
    }
   
    /**
     * 将10进制的数字字符串转为64进制的数字字符串
     * @param $m string 10进制的数字字符串
     * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
     * @return string
     * @author 野马
     */
    public function hex10to64($m, $len = 0) {
        $KeyCode = self::KeyCode;
        $hex2 = decbin($m);
        $hex2 = $this->str_rsplit($hex2, 6);
        $hex64 = array();
        foreach($hex2 as $one) {
            $t = bindec($one);
            $hex64[] = $KeyCode[$t];
        }
        $return = preg_replace('/^0*/', '', implode('', $hex64));
        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, '0', STR_PAD_LEFT);
            }
        }
        return $return;
    }
   
    /**
     * 将16进制的数字字符串转为64进制的数字字符串
     * @param $m string 16进制的数字字符串
     * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
     * @return string
     * @author 野马
     */
    protected function hex16to64($m, $len = 0) {
        $KeyCode = self::KeyCode;
        $hex2 = array();
        for($i = 0, $j = strlen($m); $i < $j; ++$i) {
            $hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, '0', STR_PAD_LEFT);
        }
        $hex2 = implode('', $hex2);
        $hex2 = $this->str_rsplit($hex2, 6);
        foreach($hex2 as $one) {
            $hex64[] = $KeyCode[bindec($one)];
        }
        $return = preg_replace('/^0*/', '', implode('', $hex64));
        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, '0', STR_PAD_LEFT);
            }
        }
        return $return;
    }
   
    /**
     * 功能和PHP原生函数str_split接近,只是从尾部开始计数切割
     * @param $str string 需要切割的字符串
     * @param $len integer 每段字符串的长度
     * @return array
     * @author 野马
     */
    protected function str_rsplit($str, $len = 1) {
        if($str == null || $str == false || $str == '') return false;
        $strlen = strlen($str);
        if($strlen <= $len) return array($str);
        $headlen = $strlen % $len;
        if($headlen == 0) {
            return str_split($str, $len);
        }
        $return = array(substr($str, 0, $headlen));
        return array_merge($return, str_split(substr($str, $headlen), $len));
    }
}
?>

工作中发现我们平时吧加密密码、授权证书、文件指纹等等进行存储和使用的时候大部分是直接使用的md5值,md5值是一个32位长16进制整数,其实我们可以吧这个16进制数转换成64进制,实现同样的功能,缩短字符串长度(32位的16进制MD5值可以压缩为22位的64进制数)。至于缩短长度有啥用处,我想你懂得O(∩_∩)O~

01 <?php
02 echo "\r\n<br />1:" . hex16to64('1');
03 echo "\r\n<br />2:" . hex16to64('2');
04 echo "\r\n<br />3:" . hex16to64('3');
05 echo "\r\n<br />4:" . hex16to64('4');
06 echo "\r\n<br />5:" . hex16to64('5');
07 echo "\r\n<br />6:" . hex16to64('6');
08 echo "\r\n<br />7:" . hex16to64('7', 5);
09 echo "\r\n<br />8:" . hex16to64('8');
10 echo "\r\n<br />9:" . hex16to64('9');
11 echo "\r\n<br />a:" . hex16to64('a');
12 echo "\r\n<br />b:" . hex16to64('b');
13 echo "\r\n<br />c:" . hex16to64('c');
14 echo "\r\n<br />d:" . hex16to64('d');
15 echo "\r\n<br />e:" . hex16to64('e');
16 echo "\r\n<br />f:" . hex16to64('f');
17 echo "\r\n<br />10:" . hex16to64('10',4);
18 echo "\r\n<br />fffffffffffffffffffffffffffffffe:" . hex16to64('fffffffffffffffffffffffffffffffe',22);
19 echo "\r\n<br />ffffffffffffffffffffffffffffffff:" . hex16to64('ffffffffffffffffffffffffffffffff',22);
20 echo "\r\n<br />126ede66b4c850a68d56526ae05fbd11:" . hex16to64('126ede66b4c850a68d56526ae05fbd11',22);
21 echo "\r\n<br />7590ee342aa65cbb0dc40418f5474aca:" . hex16to64('7590ee342aa65cbb0dc40418f5474aca',22);
22 echo "\r\n<br />";
23
24 $strarr = array();
25 $time1 = microtime(true);
26 for($i = 0; $i < 10000; ++$i) {
27     $str = md5($i);
28     $strarr[] = "{$i}->$str\r\n<br>";
29 }
30 $time2 = microtime(true);
31 $time3 = $time2 - $time1;
32
33 $time1 = microtime(true);
34 for($i = 0; $i < 10000; ++$i) {
35     $str = hex16to64(md5($i), 22);
36     $strarr[] = "{$i}->$str\r\n<br>";
37 }
38 $time2 = microtime(true);
39 echo "\r\n<br />运行10000次用时(秒):" . ($time2 - $time1 - $time3);
40
41 /**
42 * 将16进制的数字字符串转为64位的数字字符串
43 * @param $m string 16进制的数字字符串
44 * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
45 * @return string
46 * @author 野马
47 */
48 function hex16to64($m, $len = 0) {
49     $code = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_%';
50     $hex2 = array();
51     for($i = 0, $j = strlen($m); $i < $j; ++$i) {
52         $hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, '0', STR_PAD_LEFT);
53     }
54     $hex2 = implode('', $hex2);
55     $hex2 = str_rsplit($hex2, 6);
56     foreach($hex2 as $one) {
57         $hex64[] = $code[bindec($one)];
58     }
59     $return = preg_replace('/^0*/', '', implode('', $hex64));
60     if($len) {
61         $clen = strlen($return);
62         if($clen >= $len) {
63             return $return;
64         }
65         else {
66             return str_pad($return, $len, '0', STR_PAD_LEFT);
67         }
68     }
69     return $return;
70 }
71 /**
72 * 功能和PHP原生函数str_split接近,只是从尾部开始计数切割
73 * @param $str string 需要切割的字符串
74 * @param $len integer 每段字符串的长度
75 * @return array
76 * @author 野马
77 */
78 function str_rsplit($str, $len = 1) {
79     if($str == null || $str == false || $str == '') return false;
80     $strlen = strlen($str);
81     if($strlen <= $len) return array($str);
82     $headlen = $strlen % $len;
83     if($headlen == 0) {
84         return str_split($str, $len);
85     }
86     $return = array(substr($str, 0, $headlen));
87     return array_merge($return, str_split(substr($str, $headlen), $len));
88 }
89 ?>

以上代码在SAE上的执行效率还算不错:

http://enshui.sinaapp.com/jinzhi64.php

10进制和64进制互转相关推荐

  1. java 10进制转64进制_十进制与64进制互相转换算法

    实现代码如下: /** * */ package com.M.controller.test; import java.util.Stack; /** * * @author online zuozu ...

  2. javascript 10进制和64进制的转换

    原文:javascript 10进制和64进制的转换 function string10to64(number) {var chars = '0123456789abcdefghigklmnopqrs ...

  3. java 10进制转64进制_JAVA中实现十进制与其它自定义进制进行相互转换。 - yz124的日志 - 网易博客...

    我们通常用到的数字都是十进制的,日常使用的也是这样,但是在程序中,我们可能还会经常用到二进制.八进制.十六进制的数字.既然程序中会使用到,那么就会有它存在的道理.有些时候,将数字用字符串保存到文件或者 ...

  4. java 16进制转64进制_Java进制概述及进制间的相互转换

    什么是进制? 进制也是进位制,是人们规定的一种进位方法.对于任何一种进制--X进制,就表示某一位置上的数运算时是逢X进一位.十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推. 十进 ...

  5. C#实现10进制转32进制和64进制,排除0、l(L)和o

    2019独角兽企业重金招聘Python工程师标准>>> class Code32Demo{static void Main(string[] args){Console.WriteL ...

  6. js 64进制转换方法 URL参数压缩

    经常URL上面需要有不少中文,但直接放置中文容易出现乱码,所以要进行转码,但普通转码后,会发现URL太长了,不便于保存和处理.和朋友讨论以后,觉得可以使用一定的压缩算法,将转码后的中文进行处理,能够明 ...

  7. java 64进制转10进制_java进制转换

    import java.math.BigDecimal; import java.util.LinkedList; import java.util.List; import java.util.st ...

  8. 16进制与10进制互转,16进制转10进制,10进制转16进制

    近期在调试单片机时需要观看端口数据,需要将16进制数据转化成10进制数据.在网上找了蛮多都只能实现单个数据的转化,于是便用PYTHON编写了一份. import tkinter as tk root= ...

  9. php 64进制转16进制,PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]

    $mtime1= explode(" ", microtime()); $startTime= $mtime1[0] + $mtime1[1];?> 进制转换 2 8 10 ...

最新文章

  1. Docker容器的生命周期管理
  2. mysql多表查询详解_MySQL多表查询详解上
  3. memcpy、memmove、memset、memchr、memcmp、strstr详解
  4. Daily scrum 10.15
  5. AI是计算机科学,人工智能计算机科学(79种)...
  6. 面试官:怎么改进哈希算法实现负载均衡的扩展性和容错性?我:...
  7. jclasslib查看字节码
  8. 荣耀V40将采用300Hz 触控采样率,1月18日正式发布!
  9. modelandview为null的原因_一千个不用 Null 的理由!
  10. 一文带你了解目前的“光伏母亲公路” 能照明充电和融雪
  11. Sql Server 全文检索
  12. 学习笔记02-虚拟机安装Windows server 2008 r2
  13. P1336 课题选择
  14. wps两个段落之间间隔太大,将段落中的行距设为0也没用
  15. android随手记毕业论文,关于毕业论文的思考
  16. 比较工具导出html比较结果,使用Beyond Compare如何生成文件比较报告
  17. win10打开蓝牙_Win10系统中蓝牙鼠标可以配对却无法使用应该如何解决?
  18. 线程状态是五种对?还是六种对?
  19. 存储模型之虚拟存储技术
  20. 分享30个PHP源码,总有一款适合你

热门文章

  1. PCIE Feature ----- SRIOV
  2. JAVA架构师之路十六:设计模式之责任链模式
  3. SAP Fiori Belize 主题应用在 SAPGUI 里的一些要点
  4. 华为EMUI8/9刷机直通车:一篇文章拿下安卓13
  5. python之父是荷兰人_Python之父退休无聊加入微软!Python是怎样诞生的?
  6. ROC与AUC曲线绘制
  7. MySQL必会单词(一)
  8. 【Linux后端服务器开发】TCP通信设计
  9. oracle 12514监听程序,oracle监听问题 ORA-12514
  10. 使用“三剑客”做一个简易计算器