将 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. Objective C多态

    面向对象的封装的三个基本特征是.继承和多态. 包是一组简单的数据结构和定义相关的操作在上面的其合并成一个类,继承1种亲子关系,子类能够拥有父类定的成员变量.属性以及方法. 多态就是指父类中定义的成员变 ...

  2. beanutils获取带参数get方法

    public Employee getEmployee(int index) {        return new Employee();    } 1.PropertyUtils.getIndex ...

  3. UNIX基础知识--<<UNIX 环境编程>>读书笔记

    1 shell程序就是位于应用软件与系统调用之间的程序   每个用户登录系统,系统就会为用户分配shell (用户的登录的口令文件 在  /etc/passwd 2 ls filename  运行原理 ...

  4. Introsort(内观排序)

    .NET 4.5 这个版本的Array.Sort更改了STL的内观排序算法,那相对于快速排序内观排序到底有什么优化过的呢? 根据维基百科所说,这个排序算法首先从快速排序开始,当递归深度超过一定深度(深 ...

  5. C语言中数据类型的长度

    面试中C里面int长度经常会被问到,下面总结一下作为资料: 首先看看一般规定: 标准c规定,int长度等于机器字长,short的表示范围不能大于int的表示范围,long的表示范围不能小于int的表示 ...

  6. MVC常见的控制器,接口,数据层之间的操作

    user_books_info 类 namespace CiWong.LearningLevel.Mapping { public class user_books_info { /// <su ...

  7. BFS和DFS详解

    BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...

  8. JS获取table表格任意单元格值

    jsp页面表格布局 <body onload="show()"> <center> <input type="text" valu ...

  9. GC算法精解(五分钟教你终极算法---分代搜集算法)

    GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们 ...

  10. 从UI开始

    虚拟化平台cloudstack(8)——从UI开始   UI ucloudstack采用的是前后端分离的架构,就是说前端可以选择使用web.swing甚至其它的界面,都可以. 我们来看cloudsta ...