将 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#中float的取值范围和精度

    原文:C#中float的取值范围和精度 float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double. 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例中所示: floa ...

  2. 变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...

  3. winform实现动态按钮

    private void button6_MouseMove(object sender, MouseEventArgs e) { button6.ImageAlign = ContentAlignm ...

  4. 认识CLR [《CLR via C#》读书笔记]

    认识CLR [<CLR via C#>读书笔记] <CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runti ...

  5. Jumony Core 3,真正的HTML引擎

    Jumony Core 3,真正的HTML引擎,正式版发布 2013-11-28 17:22 by Ivony..., 778 阅读, 18 评论, 收藏, 编辑 Jumony是一个开源项目,已经有三 ...

  6. backbonejs mvc框架

    backbonejs mvc框架的增删查改实例 一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https ...

  7. 企业架构研究总结(44)——企业架构与建模之Archimate视图和视角

    3. ArchiMate的视角与视图 创建.维护一个企业架构是一件非常复杂繁琐的事情,因为这项工作需要面对许多背景.利益各异的干系人,对他们所关注的问题进行解答,并能够在他们之间形成无障碍的沟通流.为 ...

  8. DevExpress 学习使用之 TreeList

    1. 必须先添加列,否则不能显示任何节点内容 2. 如果是代码添加列时,一定要写明 VisibleIndex = 几,没有这句,不显示 3. 顶级结点用 TreeList.AppendNode 来添加 ...

  9. js框架漫谈

    现在实际项目中可供选择的javascript框架很多,热门的有jquery,dojo,mootools,ext等.这些框架按照不同的标准有不同的分类方法,比如按照扩展方式便可分为prototype式的 ...

  10. data格式加载图片

    html img 使用data格式加载图片   背景 这久闲来无事给一位客户测试一款体检软件,是winform结构的,其中有一个功能是需要把生成的体检报告导出为html格式.测试导出后直接在谷歌浏览器 ...