将 Int 和 BigInt 类型数值转换为字符串的可逆方法,可用于缩短网址或记录的ID转换等。

如: 9223372036854775807 => aZl8N0y58M7

class Convert
{
/**
* 默认密钥字符串
* @var string
*/
const KEY = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; /**
* 将 Int 类型十进制数值转换为指定进制编码
* @param int|string $num 取值范围 0 ~ 2147483647 之间
* @return string
*/
public static function encodeInt($num) {
$str = '';
if ($num <= 0)
$str = substr(self::KEY, 0, 1);
while ($num > 0) {
$val = intval($num / 62);
$mod = $num % 62;
$str = substr(self::KEY, $mod, 1) . $str;
$num = $val;
}
return $str;
} /**
* 将编码字符串转换为 Int 类整型数值
* @param string $code
* @return int
*/
public static function decodeInt($code){
$result = null;
$len = strlen($code);
for ($i = 1; $i <= $len; $i++) {
$char = substr($code, $i - 1, 1);
$result += intval(strpos(self::KEY, $char)) * pow(62, $len - $i);
}
return $result;
} /**
* 支持15位长度的整型,超过则精度大幅降低
* @param int $num
* @return string
*/
public static function encodeInt2($num) {
$out = '';
for ($t = floor(log10($num)/log10(62)); $t >= 0; $t--) {
$a = floor($num/bcpow(62, $t));
$out = $out . substr(self::KEY, $a, 1);
$num = $num - $a * pow(62, $t);
}
return $out;
} /**
* 支持最大15位整型字符串的解码
* @param string $num
* @return string
*/
public static function decodeInt2($num) {
$out = 0;
$len = strlen($num) - 1;
for ($t = 0; $t <= $len; $t++) {
$out = $out + strpos(self::KEY, substr( $num, $t, 1 )) * pow(62, $len - $t);
}
return $out;
} /**
* 将 BigInt 类型的数值转换为指定进制值
* @param int|string $num
* @return string
*/
public static function encodeBigInt($num) {
bcscale(0);
$str = '';
if ($num <= 0)
$str = substr(self::KEY, 0, 1);
while ($num > 0) {
$div = bcdiv($num, 62);
$mod = bcmod($num, 62);
$str = substr(self::KEY, $mod, 1) . $str;
$num = $div;
}
return $str;
} /**
* 将编码字符串转换为 BigInt 类整型数值
* @param string $code
* @return string
*/
public static function decodeBigInt($code) {
bcscale(0);
$result = '';
$len = strlen($code);
for ($i = 1; $i <= $len; $i++) {
$char = substr($code, $i - 1, 1);
$result = bcadd(bcmul(strpos(self::KEY, $char), bcpow(62, $len - $i)), $result);
}
return $result;
}
}

测试方法:

结果:

echo 'Begin ~~<br><hr><br>';
$begin = microtime(true);
$bm = memory_get_usage(); $j = 0;
$cv = new Convert();
//for ($i = 0; $i < 10000; $i++) {
$raw = '9223372036854775807';//rand(200000, 214748) . rand(1000, 3648);
$encode = $cv->encodeBigInt($raw);
$decode = $cv->decodeBigInt($encode);
// $encode = $is->encodeInt($raw);
// $decode = number_format($is->decodeInt($encode), 0, '', '');
if ($raw != $decode) {
$j++;
// echo '<script>alert("not same");</script>';
}
//}
echo '原文: '. $raw .' 长度: '. strlen($raw) .'<br>';
echo '编码: '. $encode .' 长度: '. strlen($encode) .'<br>';
echo '解码: '. $decode .'<br>';
echo '不一致:'. $j;
echo '<br>'; $em = memory_get_usage(); echo 'End !<br><hr><br>Use Time :';
echo microtime(true) - $begin;
echo '<br><hr><br>Use Mem:';
echo ceil(($em - $bm)/1024/1024) .'MB';

将int,bigint整型数值可逆转换字符串的更多相关文章

  1. 【C语言】字符串与整型数值之间的转换

    一.将字符串转化为对应的数值 /*============================================================================= # # F ...

  2. Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型 1.返回顶部 1. 整型数值类型(C# 参考) 2019/10/22 “整型数值类型”是“简单类型”的 ...

  3. java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量?

    java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量? 整数值默认就是int类型,只有在数值常量后面加“L”或“l”才表明该常量是long型

  4. Java中二进制数与整型之间的转换

    import java.io.*; public class Test{ /** * 二进制与整型之间的转换 * @param args * @throws IOException */ public ...

  5. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

  6. Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)

    提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...

  7. python基础一整型、bool、字符串

    1整型.bool.字符串 1.整型 --数字(int) ​ 用于比较运算的 ​ 32位 -2 ** 31 ~ 2 ** 31 -1 ​ 64位 -2 ** 63 ~ 2 ** 63 -1 ​ 基础运算 ...

  8. Java把长整型时间转成字符串日期

    数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOExc ...

  9. Number 强制类型转换 int 强制转换整型 float 强制转换浮点型 complex 强制转换成复数 bool 强制转换成布尔类型,结果只有两种,要么True 要么 False """bool 可以转换所有的数据类型 everything"""

    # ###Number 强制类型转换 var1 = 5 var2 = 4.85 var3 = True var3_2 = False var4 = 3+9j var5 = "888777&q ...

随机推荐

  1. C#实现文档转换成PDF

    网上有很多将doc.ppt.xls等类型的文档转换成pdf的方法,目前了解到的有两大类: 1.使用虚拟打印机将doc.ppt.xls等类型的文档 2.使用OFFICE COM组件 我采用了第二种方法实 ...

  2. [置顶] NB多项式事件模型、神经网络、SVM之函数/几何间隔——斯坦福ML公开课笔记6

    转载请注明:http://blog.csdn.net/xinzhangyanxiang/article/details/9722701 本篇笔记针对斯坦福ML公开课的第6个视频,主要内容包括朴素贝叶斯 ...

  3. js判断浏览器类型(手机和电脑终端)

    工作中经常会用到通过js来判断浏览器的功能!今天这里通过js来判断浏览器是来自移动设备还是pc设备! 代码如下: var browser={ versions:function(){ var u = ...

  4. CreateFont详细解释

    CFont * f;    f = new CFont;    f->CreateFont(10, // nHeight         0, // nWidth         0, // n ...

  5. asp.net mvc请求响应模型原理回顾

    根据讲师所讲总结了一下(可能存在些描述错误) -------------mvc进入asp.net管道原理: (在执行httpapplication管道之前mvc和asp.net是相同的,不同之处在于管 ...

  6. Mysql 嵌套游标添以及任意位置声明变量的方法

    在写存储过程的时候,会遇到某个游标的筛选条件来自于 先前语句运行的结果,比较常见的方式是 再写一个存储过程,通过调用来完成 动态参数的配置, 或者使用 动态sql的功能,而这两种方式都不能很好的解决这 ...

  7. 【转载】如何让Chrome浏览器允许本地环境支持Ajax

    转载自:http://www.bewxx.com/news/news_89.html 对于网站前端人员来说,我们在本地开发程序的时候如果用到Ajax的话,通常会使用Firefox来测试,因为Firef ...

  8. Dirichlet's Theorem on Arithmetic Progression

    poj3006 Dirichlet's Theorem on Arithmetic Progressions 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. ...

  9. Visual Studio 2013 发布正式版

    SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好? Visual Studio 2013 发布正式版及使用感受 (注意:文末我添加了一个小节,用来更新最新的一些使用感受.) ...

  10. TypeScript开发程序

    使用TypeScript开发程序 简介 TypeScript一直发展不错,我们公司在开发新功能时,考虑到程序的可维护性,使用了TypeScript编写浏览器上的程序,我们是从零开始使用TypeScri ...